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

Go 的 new 关键字存在的意义是什么?

  •  
  •   sun1991 · 2018-02-13 13:12:22 +08:00 · 3741 次点击
    这是一个创建于 2474 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 Go 产生的疑问:

    type Counter struct{...}
    
    ctr := new(Counter) //1
    ctr := &Counter{} //2
    

    写法 2 完全可以取代写法 1 的话, 为什么还要引入 new 这个关键字?

    18 条回复    2018-02-14 10:45:56 +08:00
    mason961125
        1
    mason961125  
       2018-02-13 13:50:22 +08:00 via iPhone
    wweir
        2
    wweir  
       2018-02-13 13:54:42 +08:00 via Android
    @mason961125 然而,这文档并没有回答这个问题
    wweir
        3
    wweir  
       2018-02-13 13:55:57 +08:00 via Android
    可以从汇编后的指令来找找区别
    owenliang
        4
    owenliang  
       2018-02-13 13:58:05 +08:00
    我好像没用过 new。
    owenliang
        5
    owenliang  
       2018-02-13 14:01:48 +08:00
    @owenliang new int 这种,也许...
    fuxiaohei
        6
    fuxiaohei  
       2018-02-13 14:07:10 +08:00   ❤️ 1
    miketeam
        7
    miketeam  
       2018-02-13 14:10:16 +08:00 via iPhone
    new prod reference,&取地址值,
    lloovve
        8
    lloovve  
       2018-02-13 14:20:53 +08:00 via iPhone   ❤️ 1
    一般编译器会给你自动处理,第一种写法是意义明确,第二种是编译器自动 new 了
    sun1991
        9
    sun1991  
    OP
       2018-02-13 14:38:29 +08:00
    @fuxiaohei 谢谢, 不过例子看起来是个很牵强的用法...
    @lloovve 姑且这样认为吧. 谢谢.
    miketeam
        10
    miketeam  
       2018-02-13 14:39:31 +08:00 via iPhone
    第二种是你自己已经手动的生产了一个实例的意思,然后取其地址!
    SuperFashi
        11
    SuperFashi  
       2018-02-13 15:34:11 +08:00 via Android
    内建类型明显就用不了第二种了啊。
    chai2010
        12
    chai2010  
       2018-02-13 15:49:56 +08:00 via iPhone
    new 只是语法糖,不要拿汇编代码当证据,汇编只是一种实现而已。new 主要针对非结构体类型,缺点是没办法设置初始值,多年前提过 issue 建议加第二个可选参数,就看 Go2 是否能改进了
    sun1991
        13
    sun1991  
    OP
       2018-02-13 16:12:14 +08:00
    @SuperFashi 明白. 只是觉得内建类型很少会这样用.
    一方面, Go 尽量节省关键字, 比如没有 while 而用 for 代替, 另一方面却整出个没多大用处的 new, 而且语义上和传统的面向对象的 new 关键字不一样, 更像是 malloc.
    whisper219
        14
    whisper219  
       2018-02-13 16:20:25 +08:00   ❤️ 1
    1 是直接分配到堆上
    2 会涉及到逃逸检测,看最终是分配到栈还是堆上
    sun1991
        15
    sun1991  
    OP
       2018-02-13 16:49:16 +08:00
    @whisper219 有出处吗?
    Paddington
        16
    Paddington  
       2018-02-13 17:10:18 +08:00
    你确定 写法 2 完全可以取代写法 1 ?
    swananan
        17
    swananan  
       2018-02-13 17:58:43 +08:00
    语法糖吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:12 · PVG 22:12 · LAX 06:12 · JFK 09:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.