他の答えは良いですが、私の意見では、いくつかの情報が不足しています。
次のコードで示されているように、Goのレシーバーは単なる構文糖衣です。
package main
import "fmt"
type Something struct {
Value int
}
func (s *Something) ChangeValue(n int) {
s.Value = n
}
func main() {
o := new(Something) // o is of type *Something
fmt.Println(o.Value) // Prints 0
o.ChangeValue(8) // Changes o.Value to 8
fmt.Println(o.Value) // Prints 8
(*Something).ChangeValue(o, 16) // Same as calling o.ChangeValue(16)
fmt.Println(o.Value) // Prints 16
}
これに基づいて、のレシーバーが1へのポインターではなくChangeValue
typeの値である場合にどうなるかを考えてください...Something
それは正しい!o
このメソッドを使用して、のValue
フィールドを実際に変更することはできません。ほとんどの場合、カプセル化を行うためにポインターレシーバーを使用します。