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}