在 GoLang 中初始化对象 - 堆/栈这个概念是否存在?

我刚开始使用 GoLang。我注意到有一些这样的初始化

agentUi := &f.Foo{
        Reader:      os.Stdin,
        Writer:      os.Stdout,
        ErrorWriter: os.Stderr,
    }

来自 c++ 背景,我的印象是上面的原因是因为开发人员想要创建一个指针 agentUi 而不是他可以做这样的事情的对象

agentUi := f.Foo{
        Reader:      os.Stdin,
        Writer:      os.Stdout,
        ErrorWriter: os.Stderr,
    }

所以基本上确保对象在范围结束后仍然有效。简而言之,在堆而不是堆栈上创建对象。那是对的吗 ?


慕的地6264312
浏览 101回答 1
1回答

慕村225694

Go 不允许直接控制您使用的内存的分配位置。如果您不使用引用,则内存是从堆栈分配的。如果您传递引用,编译器会进行转义分析以尝试从堆栈分配内存,但如果失败,则会在堆上分配内存。您可以使用-gcflags '-m -l'查看程序的逃逸分析。go run -gcflags '-m -l' main.go例如,在下面的程序中验证逃逸分析。package mainimport (    "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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go