V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
junmoxiao
V2EX  ›  Go 编程语言

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

  •  
  •   junmoxiao · 2022-08-15 23:34:23 +08:00 · 2256 次点击
    这是一个创建于 812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前用 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)
    }
    
    4 条回复    2022-08-16 00:42:20 +08:00
    seers
        1
    seers  
       2022-08-15 23:44:39 +08:00 via Android
    编译器会逃逸分析然后决定 heap 或者 stack ,总的来说并不需要关心
    daytonight
        2
    daytonight  
       2022-08-16 00:02:13 +08:00   ❤️ 1
    new 会分配零值,并返回对象的地址 *T ,所以 new(Pearson) 和 &Person{} 是一样的。当成员的零值能直接使用,不需要进一步初始化的时候,new 就比较实用。可以看看这个 https://go.dev/doc/effective_go#allocation_new
    joesonw
        3
    joesonw  
       2022-08-16 00:24:54 +08:00 via iPhone   ❤️ 1
    mstmdev
        4
    mstmdev  
       2022-08-16 00:42:20 +08:00
    可以输出 go 汇编代码研究一下。
    go tool compile -S main.go
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3163 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 12:30 · PVG 20:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.