xia*_*uan 0 stack memory-management heap-memory go escape-analysis
关于此代码的问题。为什么变量逃逸到堆
func main() {
port := "8080"
host := "localhost:"
connection := host + port
fmt.Println(connection)
}
Run Code Online (Sandbox Code Playgroud)
gorun -gcflags "-m -l" main.go
# command-line-arguments
./main.go:12:21: host + port escapes to heap
./main.go:13:13: ... argument does not escape
./main.go:13:13: connection escapes to heap
Run Code Online (Sandbox Code Playgroud)
我发现如果使用fmt.Sprintf它也会导致变量逃逸到堆
fmt导致转义的不是连接而是对包的调用。
如果您println()改为调用内置函数,则不会:
println(connection)
Run Code Online (Sandbox Code Playgroud)
运行go run -gcflags "-m -l" main.go:
# command-line-arguments
./main.go:12:21: host + port does not escape
localhost:8080
Run Code Online (Sandbox Code Playgroud)
如果fmt.Println()编译器不能保证传递的值会发生什么,所以它把它放在堆上。