V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ppolanwind
V2EX  ›  Go 编程语言

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

  •  
  •   ppolanwind · 2022-08-08 16:40:43 +08:00 · 837 次点击
    这是一个创建于 598 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 条回复    2022-08-09 21:02:48 +08:00
    ppolanwind
        1
    ppolanwind  
    OP
       2022-08-08 20:41:10 +08:00
    空接口这个地方越学越困惑了。

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

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

    求大佬解释。
    wwqgtxx
        2
    wwqgtxx  
       2022-08-08 21:20:42 +08:00
    katsusan
        3
    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
        4
    ppolanwind  
    OP
       2022-08-09 17:40:16 +08:00
    @katsusan

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

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

    sorry,调试了下的确只有指针会直接储存, russ cox 的文章有点老了,估计实现被重新评估后丢掉了一部分.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1223 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:05 · PVG 02:05 · LAX 11:05 · JFK 14:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.