導入
構造体(データ)に「その型のための関数」を結びつけたものが メソッド です。「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)の違いとして押さえておきましょう。