非指针类型赋值给空接口,编译器会生成一个临时变量再将指针传递给空接口吗?

2022-08-08 16:40:43 +08:00
 ppolanwind

小弟最近在学 golang ,遇到这样一个问题,如标题所示。 因为空接口的底层数据接口是要接收一个数据指针,那么当我们将一个非指针类型变量赋值给空接口时,golang 是怎么处理的呢? 另外,像类似这样的问题,有什么好的学习资料可以分享一下吗?

866 次点击
所在节点    Go 编程语言
5 条回复
ppolanwind
2022-08-08 20:41:10 +08:00
空接口这个地方越学越困惑了。

如果把一个 int 类型的值赋值给空接口,那空接口里面的数据指针指向哪里?

如果把一个*int 类型的值赋值给空接口,那空接口里面的数据指针指向哪里?

求大佬解释。
wwqgtxx
2022-08-08 21:20:42 +08:00
katsusan
2022-08-09 15:48:43 +08:00
> 如果把一个 int 类型的值赋值给空接口,那空接口里面的数据指针指向哪里?

把类型 T 的数据 d 赋值给空接口(可以描述为<data,type>的二元组)会在栈或堆上复制一份拷贝 d',
然后把 d'的地址写到空接口的 data 上.

特别地,如果 T 恰好是一个机器字长(比如 amd64 下的 int64), 那么会把 d 的值直接赋值到 data 处.

参考 https://research.swtch.com/interfaces.
ppolanwind
2022-08-09 17:40:16 +08:00
@katsusan

> 特别地,如果 T 恰好是一个机器字长(比如 amd64 下的 int64), 那么会把 d 的值直接赋值到 data 处.

我做了几个小测试,发现不符合这个规律呢?空接口的 data 应该还是存的指针吧?
katsusan
2022-08-09 21:02:48 +08:00
> 我做了几个小测试,发现不符合这个规律呢?空接口的 data 应该还是存的指针吧?

sorry,调试了下的确只有指针会直接储存, russ cox 的文章有点老了,估计实现被重新评估后丢掉了一部分.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871463

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX