为什么具有非指针值的接口在 Go 中不可寻址
Golang 的接口文档表明接口中存储的值是不可寻址的,类似映射到地图中的元素。这就提出了为什么接口值是不可寻址的问题。
tl;dr:维护类型完整性
为了保持类型完整性,非指针值存储在接口中是不可寻址的。考虑接口中指向 A 类型值的指针 (*A)。如果随后在接口中存储了不同的类型(例如 B),则指向 A 的指针将变得无效,从而危及类型安全。
解决含义
如果接口值是可寻址的,这会导致意想不到的效果。例如,对于接口 I、实现 I 的两种类型 A 和 B,以及 I 实例中的存储 A,获取存储值的地址将允许通过该地址修改原始值。但是,当 I 中存储另一个值 B 时,指向原始 A 值的指针将变得无效。
指针警告
而非指针接口值则不然可寻址,可以使用显式转换获得指向该值副本的指针,例如 var a2 A = i.(A) 后跟 var aPtr *A = &a2.
结论
接口值的不可寻址性通过在接口中存储不同类型的值时防止无效的指针引用来确保类型完整性。
以上是为什么 Go 接口中的非指针值不可寻址?的详细内容。更多信息请关注PHP中文网其他相关文章!