導入
構造体(データ)に「その型のための関数」を結びつけたものが メソッド です。「User の自己紹介」のように、データと振る舞いをまとめられます。
説明
package main
import "fmt"
type User struct {
Name string
Age int
}
// User 型に対する Greet メソッド
func (u User) Greet() string {
return fmt.Sprintf("%s(%d歳)です", u.Name, u.Age)
}
func main() {
u := User{Name: "鈴木", Age: 25}
fmt.Println(u.Greet()) // 鈴木(25歳)です
}
func (u User) Greet() string…funcと関数名の間にある(u User)が レシーバ。「この関数はUser型のメソッドですよ」という指定です。- メソッドの中では、レシーバ
uを通じてフィールド(u.Name)を使えます。 - 呼び出しは
u.Greet()のように、値.メソッド名()の形です。
値を書き換えるメソッドを作りたいときは、レシーバをポインタ(*User)にします。
func (u *User) Birthday() {
u.Age++ // 元の値を実際に増やす
}
*User(ポインタレシーバ)にすると、メソッドの中での変更が呼び出し元にも反映されます。
やってみよう
Greet の中の書式を変えれば、自己紹介の文面を変えられます。Birthday() を呼ぶと Age が1増える点も、値レシーバ(User)とポインタレシーバ(*User)の違いとして押さえておきましょう。
演習
田中(30歳)の User にも Greet() を呼んで、田中(30歳)です と表示してください。
ヒント1を見る
メソッドは 変数.メソッド名() の形で呼びます。定義済みの Greet はそのまま使えます。
ヒント2を見る
u2 := User{Name: "田中", Age: 30} を作り、fmt.Println(u2.Greet()) を足します。