0

关于此代码的问题。为什么变量逃逸到堆

func main() {
    port := "8080"
    host := "localhost:"
    connection := host + port
    fmt.Println(connection)
}

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

我发现如果使用fmt.Sprintf它也会导致变量逃逸到堆

4

1 回答 1

6

fmt导致逃逸的不是串联而是对包的调用。

如果您println()改为调用内置函数,它不会:

println(connection)

运行go run -gcflags "-m -l" main.go

# command-line-arguments
./main.go:12:21: host + port does not escape
localhost:8080

如果fmt.Println()编译器不能保证传递的值会发生什么,所以它把它放在堆上。

于 2020-11-25T01:13:35.497 回答