“ Effective Go”文档说以下内容。
有关接收器的指针与值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法。
http://tip.golang.org/doc/effective_go.html#pointers_vs_values
这样,如果我定义如下的方法,就不能使用值来调用它吗?
func (self *someStruct) Change(newNum int) {
self.propertyOne = newNum
}
但是,以下似乎仍然有效。
structInstance := &someStruct{
propertyOne: 41,
}
(*structInstance).Change(456)
为什么?
是否将值转换(*structInstance)
回Change
调用的地址/指针?
如何确保某个类型的实例不能调用指针上定义的方法(如Change
)?
根据语言规范:
x.m()
如果方法集(的类型)x
包含m
并且参数列表可以分配给的参数列表,则该方法调用有效m
。如果x
是可寻址且&x
方法集包含m
,x.m()
则为(&x).m()
在您的示例中,的方法集中没有Change
方法(*structInstance)
,但是它是可寻址的,并且该方法存在于&(*structInstance)
的方法集中,因此该调用被解释为(&(*structInstance)).Change(456)
或更简单structInstance.Change(456)
。
防止此行为的唯一方法是还要在Change
上定义方法someStruct
,也许会使它感到恐慌。不过,这并不理想,因为它只会在运行时告诉您有关问题的信息。构造您的程序将减少混乱,因此使用此速记实际上并不重要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句