Goの構造体にメソッドを定義する際の主要なポイントをまとめる。
構造体のメソッド定義
Go言語では、任意の型にメソッド追加が可能である。
構造体にメソッドを追加することで、オブジェクト指向言語のクラスに似た振る舞いを実現できる。
サンプル
type Struct struct {
v int
}
func (s Struct) PrintStatus() {
log.Println("Struct:", s.v)
}
レシーバーの型
レシーバーの型は値型かポインター型にすることができる。
これによって、メソッド内で構造体の状態を変更できるかどうかが決まる。
サンプル
package main
import (
"fmt"
)
// 'Person' 構造体を定義。いくつかのフィールドを含む。
type Person struct {
Name string
Age int
}
// 値レシーバーメソッド:元の構造体を変更しない。
func (p Person) Greet() {
fmt.Println("こんにちは、私の名前は", p.Name, "です。")
}
// ポインターレシーバーメソッド:元の構造体を変更する。
func (p *Person) Birthday() {
p.Age++
fmt.Println("お誕生日おめでとう!私は今", p.Age, "歳です。")
}
func main() {
// Personのインスタンスを作成
person := Person{Name: "Alice", Age: 30}
// Greetメソッドを呼び出す - 値レシーバー
person.Greet()
// Birthdayメソッドを呼び出す - ポインターレシーバー
person.Birthday()
// 更新されたpersonの状態を表示
fmt.Println("更新されたperson:", person)
}
注意点
- レシーバーが値型であっても、構造体のフィールドにポインターが含まれている場合、ポインターが指す実体は変更される。
- レシーバーが値型であっても、構造体のフィールドの値を変更してもエラーにはなりませんが、これは意図しないバグの原因になる可能性がある。
参考