gpt4 book ai didi

go - 关于 Go 中的接口(interface)

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:06 26 4
gpt4 key购买 nike

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()) 时会自动解除引用,但在对接口(interface)变量 (var i IA = SA{}) 赋值时却不能吗?

最佳答案

func (this *SA) Method() 表示只有指向类型 SA (*SA) 的指针具有 Method() 方法,因此 var i IA = &SA{} 实现了 IA 接口(interface)。

如果您将其更改为读取 func (this SA) Method(),则 var i IA = SA{} 实现接口(interface),而不是 var i IA = &SA{}

*SASA 不是同一类型。

Go 提供了一些处理解引用方法值的快捷方式(这可能是混淆的来源)

如果您查看 Method Values section of the spec你会看到:

a reference to a non-interface method with a value receiver using a pointer will automatically dereference that pointer

a reference to a non-interface method with a pointer receiver using an addressable value will automatically take the address of that value

这就是为什么无论 obj*SA 还是 SAobj.Method() 都有效。

希望对您有所帮助。

关于go - 关于 Go 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29048088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com