问题场景
分析一下,下面代码的输出是什么(判断a==c)的部分
package main
import (
"fmt"
"runtime"
)
type obj struct{
}
func main() {
a := &obj{
}
fmt.Printf("%p\n", a)
c := &obj{
}
fmt.Printf("%p\n", c)
fmt.Println(a == c)
}
很多人可能一看,a和c完全是2个不同的对象实例,便认为a和c具备不同的内存地址,故而判断a==c的结果为false。我也是一样。我们看一下实际输出:
0x1181f88
0x1181f88
true
问题分析
要分析上面的问题,就需要了解一些Golang内存分配,以及变量在内存逃逸的知识。上面的代码,有打印a和c的内存地址。倘若我们去掉任意一个(或者将打印内存的地址都去掉也一样),则 a==c 的判断输出,就是 false。再看一下代码:
package main
import (
"fmt"
)
type obj struct{
}
func main() {
a :=