首页 >后端开发 >Golang >为什么 Golang 接口中的不可寻址值无法通过地址访问?

为什么 Golang 接口中的不可寻址值无法通过地址访问?

Susan Sarandon
Susan Sarandon原创
2024-11-28 06:25:17431浏览

Why Are Non-Addressable Values in Golang Interfaces Not Accessable by Address?

Golang 接口中的不可寻址值

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn