在Go语言中,变量是否在栈上还是在堆上分配是由编译器在编译阶段进行"逃逸分析"决定的。如果一个变量只在函数作用域内部使用,它往往会被分配在栈上;如果一个变量被外部引用,或者被返回到函数外部,那么它就可能"逃逸"到堆上。
要查看一个Go程序的逃逸分析结果,你可以在构建程序时使用-gcflags='-m'
选项。例如:
go build -gcflags='-m' main.go
编译器将输出关于变量如何被分配的信息。例如,我们可能会看到类似以下的输出:
./main.go:9:6: can inline foo with cost 5 as: ...
./main.go:14:9: &x escapes to heap
./main.go:14:9: from ~r0 (return) at ./main.go:15:2
上述输出表明,在main.go的第14行,变量 x 逃逸到了堆。