package main
type Person struct {
A int
B int
}
func f() *Person {
var bob *Person = &Person{4, 5}
return bob
}
func main() {
var bob *Person = &Person{2, 3}
println(bob)
bob = f()
println(bob)
}
要查看里面发生了什么,我建议将此文件翻译成汇编程序:GOOS=linux GOARCH=amd64 go tool compile -S some.go
你的问题的答案是“任何事情都会发生”。
这是具有两种使用对象的方法的代码。在函数中,
main
对象是本地的,在f
创建的对象中,它被返回。要查看里面发生了什么,我建议将此文件翻译成汇编程序:
GOOS=linux GOARCH=amd64 go tool compile -S some.go
bob
内部分配f
:一个指向 Person 类型描述符的指针被加载到堆栈上并调用该函数
runtime.newobject
。然后,在函数返回的地址,字段被初始化。也就是说,对象分配在内存中的某处,而不是堆栈上。bob
内部分配main
:如您所见,在这种情况下
bob
被放置在 stack 上。这就是你问题的答案,对吧?在堆栈上创建一个临时对象,而在内存中分配一个非本地对象。
但它实际上更有趣。
f
编译器优化函数nafig。编译器不是调用,而是在堆栈上f
创建一个结构。Person{4,5}
所以如果我是你,我不会试图准确预测 Go 放置对象的位置。