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