func main() { a := struct{}{} b := struct{}{} println(&a, &b, &a == &b) c := new(struct{}) d := new(struct{}) println(c, d, c == d)
} 执行go run -gcflags="-N -l" main.go,结果如下
0xc00004672e 0xc00004672e false 0xc00004672e 0xc00004672e true
求大佬们解惑
曹大给了完整解答,善用 Google
不太一样哦。我在看了曹大的博客后才有了上面的问题,给出的代码没有栈逃逸
&a == &b 这个是两个地址比较,空结构体地址比较为 false , 这个是go有意为之 c == d 这个是两个指针比较 ,go 指针比较的原则是 : 如果两个指针都指向同一个变量,则此运算符返回true。或如果两个指针都指向不同的变量,则返回false
spec明确写了指向zero-size对象的指针的比较结果不确定。
https://golang.google.cn/ref/spec#Comparison_operators
Pointer values 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.