栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

给接口赋值会复制任何东西吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

给接口赋值会复制任何东西吗?

的数据

int(42)
被复制。试试这个代码:

func main() {    var i Interface    impl := Implementation(42)    i = impl    fmt.Println(i.String())    impl = Implementation(91)    fmt.Println(i.String())}

(游乐场链接)

您会发现第二个

i.String()
仍然显示
42
。Go的棘手方面之一可能是方法接收者也可以是指针。

func (v *Implementation) String() string {    return fmt.Sprintf("Hello %d", *v)}// ...i = &impl

如果要接口保留指向的原始值的指针,这就是您想要的

impl
。接口“内部”是一个结构,它持有指向某些数据或数据本身(以及一些我们可以出于目的而忽略的类型元数据)的指针。如果数据本身的大小小于或等于一个机器字(无论是指针,结构还是其他值),则将存储数据本身。

否则它将是指向某些数据的指针,但这是棘手的部分:如果实现接口的类型是struct,则指针将指向struct的 副本
,而不是分配给接口变量本身的struct。或至少在语义上用户可以这样认为,优化可以允许在两个值分开之前(例如,直到您调用

String
或重新分配
impl
)才复制该值。

简而言之:分配给接口可以在语义上被认为是实现接口的数据的副本。如果这是指向类型的指针,则复制该指针,如果是大结构,则复制该大结构。在后台使用指针的接口的详细信息是出于垃圾收集的原因,并确保堆栈以可预测的数量扩展。就开发人员而言,应将它们视为分配的实现类型的特定实例的语义副本。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436286.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号