Go 有 gc 的话,创建结构体是直接创建还是用 new 好?

2022-08-15 23:34:23 +08:00
 junmoxiao

之前用 C++的话,引用不能指向栈里的数据。

但是在 Go 里面有 gc ,而且从函数返回后,还能继续使用指向里面的指针(原理是啥?在堆里面给他分配了一块空间,再把数据复制过去?)

创建结构体是直接创建还是用 new 好?或者说他们分别适用于什么场景?

像如下的代码,创建对象之后使用基本感受不到有啥区别( Go 中函数里面创建的变量也是在栈里?唯一可能会担心栈里面的数据太多会达到栈的大小限制?)

type Person struct {
	Name string
}
func main() {
    p1 := &Person{}
    p2 := new(Person)
    
    p1.Name = "p1"
    p2.Name = "p2"
    
    fmt.Println(p1.Name)
    fmt.Println(p2.Name)
}
2270 次点击
所在节点    Go 编程语言
4 条回复
seers
2022-08-15 23:44:39 +08:00
编译器会逃逸分析然后决定 heap 或者 stack ,总的来说并不需要关心
daytonight
2022-08-16 00:02:13 +08:00
new 会分配零值,并返回对象的地址 *T ,所以 new(Pearson) 和 &Person{} 是一样的。当成员的零值能直接使用,不需要进一步初始化的时候,new 就比较实用。可以看看这个 https://go.dev/doc/effective_go#allocation_new
joesonw
2022-08-16 00:24:54 +08:00
mstmdev
2022-08-16 00:42:20 +08:00
可以输出 go 汇编代码研究一下。
go tool compile -S main.go

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/873074

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX