構造体でのメソッド定義
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 6/68。
Goでは、メソッドは特定の型に属する関数です。単独で存在する通常の関数とは異なり、メソッドはstructsに関連付けられ、カスタムデータ型に対して振る舞いを定義することを可能にします。
メソッドを定義するには、funcキーワードとメソッド名の間にレシーバを配置します。レシーバは、そのメソッドがどの型に属するかを指定します。
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}この例では、(p Person) はレシーバであり、greet を Person 型のメソッドにしています。変数 p は、メソッドが呼び出される Person のインスタンスを表しており、他の言語の this に似ています。
その後、任意の Person インスタンスに対してドット記法を使用してメソッドを呼び出すことができ、構造体にそのデータに関連するアクションを実行する能力を与えます。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単このチャレンジでは、シンプルな書籍管理システムを作成することで、構造体にメソッドを定義する練習をします。Book 構造体を作成し、その書籍の情報を表示するためのメソッドを定義します。
重要な注意点: 書籍のタイトルや著者名にはスペースが含まれる可能性があるため、入力行全体を読み取るには bufio.Scanner を使用する必要があります。fmt.Scanln 関数は最初のスペースで読み取りを停止するため、複数の単語からなるタイトルや著者名が途切れてしまいます。bufio.NewScanner(os.Stdin) を使用し、scanner.Scan() に続いて scanner.Text() を呼び出すことで、完全な行を読み取ってください。
3つの入力を受け取ります:
- 書籍のタイトルを表す文字列 (例:
"The Go Programming Language") - 著者名を表す文字列 (例:
"Alan Donovan") - ページ数を表す文字列 (例:
"380")
あなたのタスクは以下の通りです:
- 3つのフィールドを持つ
Book構造体を定義します:Title(string)、Author(string)、Pages(int) "Title: [title], Author: [author], Pages: [pages]"という形式で書籍情報を出力する、値レシーバを持つdisplayInfoという名前のメソッドを作成します。"[title] by [author]"という形式の文字列を返す、値レシーバを持つgetDescriptionという名前のメソッドを作成します。bufio.Scannerを使用して入力行を適切に読み取ります:- スキャナーを作成する:
scanner := bufio.NewScanner(os.Stdin) - 各入力行に対して:
scanner.Scan()を呼び出し、次にscanner.Text()を呼び出す - これにより、スペースを含むタイトルや著者名が正しく読み取られるようになります
- スキャナーを作成する:
- 入力を解析して
Bookインスタンスを作成します displayInfoメソッドを呼び出して書籍情報を出力しますgetDescriptionメソッドを呼び出し、返された説明文を出力します
メソッドはレシーバ変数を使用して構造体のフィールドにアクセスし、それぞれの操作を実行する必要があります。値レシーバを持つメソッドは、構造体インスタンスのコピーを操作することを忘れないでください。
チートシート
Goのメソッドは、特定の型に属する関数です。これらは、funcキーワードとメソッド名の間にレシーバを置いて定義されます。
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}レシーバ (p Person) は、greet を Person 型のメソッドにします。変数 p は、メソッドが呼び出されるインスタンスを表します。
メソッドは構造体のインスタンスに対してドット記法を使用して呼び出され、構造体が自身のデータに関連するアクションを実行できるようにします。
自分で試してみよう
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: ここで Book 構造体を定義してください
// TODO: ここで displayInfo メソッドを定義してください
// TODO: ここで getDescription メソッドを定義してください
func main() {
// 入力行を読み取るためのスキャナーを作成します
scanner := bufio.NewScanner(os.Stdin)
// タイトルを読み取ります
scanner.Scan()
title := scanner.Text()
// 著者を読み取ります
scanner.Scan()
author := scanner.Text()
// ページ数を読み取ります
scanner.Scan()
pagesStr := scanner.Text()
// ページ数の文字列を整数に変換します
pages, _ := strconv.Atoi(pagesStr)
// TODO: Book インスタンスを作成し、メソッドを呼び出します
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。