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

2018-02-13 13:12:22 +08:00
 sun1991

初学 Go 产生的疑问:

type Counter struct{...}

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

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

3742 次点击
所在节点    Go 编程语言
18 条回复
mason961125
2018-02-13 13:50:22 +08:00
wweir
2018-02-13 13:54:42 +08:00
@mason961125 然而,这文档并没有回答这个问题
wweir
2018-02-13 13:55:57 +08:00
可以从汇编后的指令来找找区别
owenliang
2018-02-13 13:58:05 +08:00
我好像没用过 new。
owenliang
2018-02-13 14:01:48 +08:00
@owenliang new int 这种,也许...
fuxiaohei
2018-02-13 14:07:10 +08:00
miketeam
2018-02-13 14:10:16 +08:00
new prod reference,&取地址值,
lloovve
2018-02-13 14:20:53 +08:00
一般编译器会给你自动处理,第一种写法是意义明确,第二种是编译器自动 new 了
sun1991
2018-02-13 14:38:29 +08:00
@fuxiaohei 谢谢, 不过例子看起来是个很牵强的用法...
@lloovve 姑且这样认为吧. 谢谢.
miketeam
2018-02-13 14:39:31 +08:00
第二种是你自己已经手动的生产了一个实例的意思,然后取其地址!
SuperFashi
2018-02-13 15:34:11 +08:00
内建类型明显就用不了第二种了啊。
chai2010
2018-02-13 15:49:56 +08:00
new 只是语法糖,不要拿汇编代码当证据,汇编只是一种实现而已。new 主要针对非结构体类型,缺点是没办法设置初始值,多年前提过 issue 建议加第二个可选参数,就看 Go2 是否能改进了
sun1991
2018-02-13 16:12:14 +08:00
@SuperFashi 明白. 只是觉得内建类型很少会这样用.
一方面, Go 尽量节省关键字, 比如没有 while 而用 for 代替, 另一方面却整出个没多大用处的 new, 而且语义上和传统的面向对象的 new 关键字不一样, 更像是 malloc.
whisper219
2018-02-13 16:20:25 +08:00
1 是直接分配到堆上
2 会涉及到逃逸检测,看最终是分配到栈还是堆上
sun1991
2018-02-13 16:49:16 +08:00
@whisper219 有出处吗?
Paddington
2018-02-13 17:10:18 +08:00
你确定 写法 2 完全可以取代写法 1 ?
swananan
2018-02-13 17:58:43 +08:00
语法糖吧
whisper219
2018-02-14 10:45:56 +08:00

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

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

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

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

© 2021 V2EX