Go 接口中不可寻址值的概念在 Golang 文档和社区论坛中广泛讨论,提出了一个问题:为什么不能通过地址访问这些值?
As MethodSets 上的 Go wiki (https://github.com/golang/go/wiki/MethodSets#interfaces) 指出,“存储在接口中的具体值是不可寻址的,就像映射元素不可寻址一样。可寻址。”映射元素的不可寻址性很好理解,并在配套文章“为什么映射值不可寻址?”中有详细解释。
但是,接口中值不可寻址的根本原因尚不清楚。为什么语言设计要强加这个限制?
答案在于保持类型完整性。指向特定类型值的指针在分配给接口时应指向该类型的值。但是,如果接口可以包含不同类型的值,则每当将不同类型的值分配给接口时,指针就会变得无效。
为了说明这一点,请考虑一个接口 I 和两个类型 A 和 B,实现 I:
type I interface{} type A int type B string
如果我们在 I 中存储一个 A 值并获取该值的地址,则结果指针将指向 *A 类型。但是,如果我们随后将 B 值分配给 I,则指针将变得无效。
接口值的不可寻址性对具有指针的方法有直接影响接收器。此类方法需要一个指向特定具体类型的指针。由于接口中的非指针值是不可寻址的,因此无法将其传递给具有指针接收器的方法,从而导致错误:
<type> does not implement <interface> (<name> method has pointer receiver)
综上所述, Go 接口中值不可寻址的原因是为了保护类型完整性。指向特定类型值的指针应始终指向该类型的值,如果该值存储在可以保存不同类型值的接口中,则无法保证这一点。
以上是为什么 Golang 接口中的不可寻址值无法通过地址访问?的详细内容。更多信息请关注PHP中文网其他相关文章!