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

发布于 1周前 作者 vueper 来自 Go语言

之前用 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)

}


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

更多关于Golang Go语言中 有 gc 的话,创建结构体是直接创建还是用 new 好?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

编译器会逃逸分析然后决定 heap 或者 stack ,总的来说并不需要关心

更多关于Golang Go语言中 有 gc 的话,创建结构体是直接创建还是用 new 好?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


new 会分配零值,并返回对象的地址 *T ,所以 new(Pearson) 和 &Person{} 是一样的。当成员的零值能直接使用,不需要进一步初始化的时候,new 就比较实用。可以看看这个 https://go.dev/doc/effective_go#allocation_new

可以输出 go 汇编代码研究一下。
go tool compile -S main.go

在Go语言中,垃圾回收器(GC)的存在使得内存管理更加自动化和便捷,但这并不直接决定你是应该直接创建结构体实例还是使用new关键字。实际上,这两种方式在Go中都有广泛的应用,并且它们的行为有所不同。

  1. 直接创建:这是最常见和推荐的方式。例如,var s MyStruct(零值初始化)或s := MyStruct{}(使用零值或指定初始值创建)。这种方式直接分配内存并初始化结构体字段,更加直观和符合Go的习惯用法。

  2. 使用newnew(MyStruct)会返回一个指向MyStruct类型的零值实例的指针。这种方式在需要明确返回指针类型的场景下使用,比如当你需要将结构体的地址传递给函数时。然而,直接使用&MyStruct{}通常更为直接和清晰。

在大多数情况下,直接创建结构体实例(不使用new)是更好的选择,因为它更符合Go的惯用法,代码更加简洁和易读。同时,由于Go的GC会自动管理内存,你无需担心内存泄漏或手动释放内存的问题。

总结来说,选择哪种方式取决于你的具体需求。如果需要一个值类型的实例,直接创建即可;如果需要一个指针类型的实例,可以考虑使用new,但通常&MyStruct{}更为直观。在Go中,代码的可读性和简洁性往往比微小的性能差异更重要。

回到顶部