1 回答

TA貢獻1880條經驗 獲得超4個贊
Go 不允許直接控制您使用的內存的分配位置。
如果您不使用引用,則內存是從堆棧分配的。
如果您傳遞引用,編譯器會進行轉義分析以嘗試從堆棧分配內存,但如果失敗,則會在堆上分配內存。
您可以使用-gcflags '-m -l'查看程序的逃逸分析。
go run -gcflags '-m -l' main.go
例如,在下面的程序中驗證逃逸分析。
package main
import (
"fmt"
"io"
"os"
)
func main() {
fmt.Printf("%v\n", work())
}
type Foo struct {
Reader io.Reader
Writer io.Writer
ErrorWriter io.Writer
}
func work() *Foo {
agentUi := &Foo{
Reader: os.Stdin,
Writer: os.Stdout,
ErrorWriter: os.Stderr,
}
return agentUi
}
輸出:
$ go run -gcflags '-m -l' main.go
# command-line-arguments
./main.go:20:13: &Foo{...} escapes to heap
./main.go:10:12: ... argument does not escape
&{0xc00000e010 0xc00000e018 0xc00000e020}
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報