type IA interface {
Method()
}
type SA struct {
}
func (this *SA) Method() {
}
func main() {
var i IA = SA{} //error
var i IA = &SA{} //ok
var obj = SA{}
obj.Method()//ok
}
你能解释一下为什么GO在调用函数(obj.Method()
)的情况下会自动取消引用,但是在分配给接口变量(var i IA = SA{}
)时它可以解决吗?
答案 0 :(得分:2)
func (this *SA) Method()
表示只有指向SA
(*SA
)类型的指针具有Method()
方法,因此var i IA = &SA{}
符合IA
接口
如果您将其更改为阅读func (this SA) Method()
,则var i IA = SA{}
会完成界面,而不是var i IA = &SA{}
。
*SA
与SA
的类型不同。
Go提供了一些处理解除引用方法值的快捷方式(这可能是混乱的来源)
如果您查看Method Values section of the spec,您会看到:
使用指针对带有值接收器的非接口方法的引用将自动取消引用该指针
和
使用可寻址值对带有指针接收器的非接口方法的引用将自动获取该值的地址
这就是obj.Method()
无论obj
是*SA
还是SA
的原因。
希望有所帮助。