堆还是栈
和有些语言不同,Go中的new 不是直接分配在栈或堆上,而是取决于内存逃逸。
Go语言中的 new
不一定总是在堆上分配内存,实际分配由编译器决定,基于变量是否逃逸作用域,也就是取决于内存逃逸。内存逃逸则在堆上,否则在栈上。
Go判断内存逃逸 可以通过如下命令, 查看是否逃逸,
go build -gcflags="-m" main.go
典型的内存逃逸场景,
变量的生命周期超出了函数的作用域:如果一个变量在函数返回后仍然被引用,那么它必须分配在堆上。
变量的地址被返回:如果一个变量的地址被返回或传递给其他函数,它也可能会逃逸到堆上。
变量被传递给其他 goroutine:如果一个变量被传递给另一个 goroutine,它也会逃逸到堆上。
是否需要手动回收
不用手动回收 。
Go有自己的垃圾回收机制。简单来说就是 mark && sweap 机制,配合三色标记法等优化方式,来自动进行回收,一般不需要手动介入回收。