go 神奇的空结构体指针 &struct{} 薛定谔的相等

267 阅读1分钟

go 中空结构体有很多妙用,它是 zero-size的。比如 channel 发空结构体当信号,map 存空结构体当 Set 使用等等。不过他的指针就很神奇了,薛定谔的相等,还带来了观察者效应。

观察之前

af7ed0198344c3b545cd47f7ba1b3da6.png

观察之后

af8e1115f70849dd8f763d54aa9669b5.png

观察单个

image.png

image.png

我没看懂

image.png

image.png

在我们打印两个空结构体指针地址之前 &a&b 是不相等的,单独打印某一个也不相等,当我们两个都打印之后神奇的一幕发生了 &a&b 相等了。

关于这种情况在 go 编程规范 上搜 zero-size 能找到这么一句话。

Pointer types are comparable. Two pointer values are equal if they point to the same variable or if both have value nil. Pointers to distinct zero-size variables may or may not be equal.

指针类型是可比较的。如果两个指针值指向同一个变量或者两者的值为 nil,则它们相等。指向不同零大小变量的指针可能相等也可能不相等

小结

  • 空结构体指针比较诡异一般不建议使用。
  • 空结构体本身是 zero-size 的,而空结构体指针是 8 字节,用指针意义也不大。