在Go中,如果我定义了一个以指针作为接收器的函数,那么它不应该只允许从指针调用该函数吗?为什么可以从值本身调用此函数并产生相同的效果。
例如,在以下程序中:m1.reset()和m2.reset()具有相同的效果。即使m1是一个值而m2是一个指针。
我有点困惑,因为有 两种方法可以做同一件事, 而且不确定要遵循哪种方法。尽管大多数代码遵循使用指针字段调用函数的 约定 。我想念什么吗?
package main import "fmt" type MyStruct struct { X int } func (m *MyStruct) reset() { m.X = 0 } func main() { m1 := MyStruct{1} m2 := &MyStruct{1} fmt.Println(m1.X) fmt.Println(m2.X) m1.reset() m2.reset() fmt.Println(m1.X) fmt.Println(m2.X) }
规格说:
对应的指针类型 T的方法集是接收者 T或T的所有方法的集(也就是说,它也包含T的方法集)。
关于方法调用的下一条必要信息如下:
x.m()如果x的方法集(类型)包含m并且参数列表可以分配给m的参数列表,则该方法调用有效。如果x是可寻址的并且&x的方法集包含m,x.m()则是x的简写(&x).m()。
x.m()
(&x).m()
将以上两个内容放在一起,您将获得所看到的行为。