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

golang 中 struct{} 一个奇怪的行为

  •  
  •   newbear · 2022-09-16 00:06:04 +08:00 · 2147 次点击
    这是一个创建于 581 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知,golang 中有一个特殊的类型struct{},这个类型的变量不占用内存空间,也就是说下面两个变量 a 和 b 的地址相同。

    func main() {
    	a := struct{}{}
    	b := struct{}{}
    
    	fmt.Printf("%p %p\n", &a, &b)    // 输出  0x551090 0x551090
    }
    

    那么下面一段代码的输出也很合理:

    func main() {
    	a := struct{}{}
    	b := struct{}{}
    
    	fmt.Printf("%p %p\n", &a, &b)   // 输出  0x551090 0x551090
    	fmt.Println(&a == &b)           // 输出  true
    } 
    

    问题是下面这段代码,相比上一段代码只是去掉了第一个 fmt.Println ,a 和 b 地址竟然就不相等了?

    func main() {
    	a := struct{}{}
    	b := struct{}{}
    
    	fmt.Println(&a == &b)         // 输出  false
    }
    

    感兴趣的可以试一下,这里也有在线环境:

    https://go.dev/play/p/cldI9TWlYwZ

    https://go.dev/play/p/oPfHrBZ8Gqg

    10 条回复    2022-09-16 09:36:13 +08:00
    mstmdev
        1
    mstmdev  
       2022-09-16 00:23:48 +08:00   ❤️ 4
    看一下反汇编代码就有答案了,这篇文章有详细说明: https://mp.weixin.qq.com/s/K5B2ItkzOb4eCFLxZI5Wvw
    ampedee
        2
    ampedee  
       2022-09-16 00:25:31 +08:00
    pigmen
        3
    pigmen  
       2022-09-16 00:34:33 +08:00   ❤️ 1
    生成汇编看看?
    Jirajine
        4
    Jirajine  
       2022-09-16 01:53:58 +08:00
    真不愧是“大道至简”,gc 语言有(直接的)指针着实是糟糕的设计。
    yianing
        5
    yianing  
       2022-09-16 02:34:19 +08:00 via Android
    无关紧要
    BeijingBaby
        6
    BeijingBaby  
       2022-09-16 06:52:48 +08:00 via iPhone
    一般这么用:type a struct{}
    定义一个新类型 ,然后到处用 a{},是相等的。
    cmdOptionKana
        7
    cmdOptionKana  
       2022-09-16 08:01:38 +08:00
    是否“奇怪”,主要看标准里有没有规定,如果没有规定就只是一种巧合,不能看作一种固定行为。
    lance6716
        8
    lance6716  
       2022-09-16 08:42:41 +08:00 via Android
    Pointers to distinct zero-size variables may or may not be equal.

    https://go.dev/ref/spec
    tairan2006
        9
    tairan2006  
       2022-09-16 09:00:30 +08:00
    因为标准已经说了可能相等也可能不等╮( ̄▽ ̄")╭
    kinboy
        10
    kinboy  
       2022-09-16 09:36:13 +08:00 via Android
    op 是不是前端转 go
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1833 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:30 · PVG 00:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.