“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
)?
2 回答
从the language specification:
在您的示例中,
(*structInstance)
的方法集中没有Change
方法,但它是可寻址的,并且该方法存在于&(*structInstance)
的方法集中,因此该调用被解释为(&(*structInstance)).Change(456)
,或更简单地structInstance.Change(456)
.防止这种行为的唯一方法是在
someStruct
上定义Change
方法,也许会让人感到恐慌 . 那实际上很重要 .当在指针接收器上定义函数时,Go将自动将值转换为该函数的指针 .
我找不到现在定义的位置的引用,但我知道它在规范中的某个官方文档中 .
另外请注意,请不要在Go中使用
self
或this
.//编辑
从http://tip.golang.org/ref/spec#Calls: