为什么Go中有“新功能”?


49

我仍然对为什么要new加入Go 感到困惑。

当您要实例化结构时,您可以

t := Thing{}

您可以通过执行以下操作获取指向新实例的指针

t := &Thing{}

但是也有这种可能性:

t := new(Thing)

最后一个似乎与其他语言有些异。&Thing{}就像new(Thing)它一样简洁明了,它仅使用您经常在其他地方使用的结构。当您将其更改为&Thing{3}或时, 它也可以扩展&Thing{Feets:7}

在我看来,使用补充关键字1代价很高,它使语言更加复杂,并增加了您必须了解的内容。它可能对新手来说掩盖了实例化一个结构的背后。

它还使另一个保留字。

那么背后的原因是new什么?有时有用吗?我们应该使用它吗?


1:是的,我知道它不是语法级别的关键字,您可以对其进行阴影处理,但这并不会改变它对于合理的开发人员来说是保留字的事实。


3
“ ...去编码员...”-这就是原因。F#/ Haskell /等 对C开发人员而言非常陌生,这就是为什么他们获得〜0吸引力的原因。Scala付出了努力,现在它更加平易近人了。
2013年

12
同样,Python和Ruby与C开发人员非常陌生,因为他们使用了许多陌生的关键字,“怪异”的句法规则(大括号在哪里?)和奇怪的语义概念(生成器,元类或装饰器)。然而,它们并没有获得〜0牵引力,恰恰相反。
Xion

8
@Xion:您看过Ruby的初始增长率吗?花了很长时间才达到现在的水平(准确地说是18年)。Python甚至更老(1991!)。
Joachim Sauer 2013年

2
@AndresF。对Scala的某些抵制可能与该语言无关。作为一个年轻的程序员(25岁),这个名字本身让我想到了像Matlab这样的基于数学的语言(我对此记忆犹新)和一个像Fortran这样真正古老的语言之间的交叉。从来没有任何渴望去看它。
2013年

4
旁注:new不是Go中的关键字。这是一个内置功能。
Manish Malik 2013年

Answers:


44

最好的询问方法可能是向进行此工作的人员询问。正是我所做的

Tl; dr:它最初在make和之前存在&{},在某些情况下它仍然是要使用的功能。

基本上,这是最重要的部分:

那么new背后的原因是什么?有什么用吗?我们应该使用它吗?

没有新的就无法做到这一点

v := new(int)
*v++
fmt.Println(*v)

新功能并不是Go的标题功能,您不会发现它经常使用,但是当您需要它时,它就可以使用。

干杯

戴夫

另一个答案显示了这种解决方案:

vv := 0
v := &vv
*v++
fmt.Println(*v)

我要求进一步澄清:

所以基本上,戴夫的观点真的站不住脚吗?

在某些地方,不方便潜入新变量以获取其地址。

new(T)具有直接的含义,而不是一个多步骤的惯用法。

只有在仅凭技术上的可能性(不这样做的情况下new)本身引人注目时,Dave的观点才会下降 。

讨论不是因为很明显Go应该拥有它而已,因为几乎每种语言都拥有它吗?

“我们保留new吗?” 讨论不时弹出。由于直到Go 2才能将其取出来,如果我对Promise的理解正确,那么再次绕圈似乎没有太多。到Go 2可以考虑的时候,我们可能会有一些不同且更好的主意...

克里斯

它也在那里主要是出于历史原因:

您需要考虑项目的历史。我认为新产品是在制造之前首先引入的。

那是真实的。实际上,在提出make想法之前,我们经过了一段时间的努力。如果查看存储库日志,则可以看到make仅在2009年1月修订版9a924177598f中显示。

新的内置函数还早于&{}的概念,用于获取复合文字的地址(并且在某种意义上语法是错误的;它可能应该是(* T){T的字段},但还不够原因进行更改)。

新功能不是严格必需的,但代码实际上确实在使用它。在这一点上很难摆脱它。

伊恩


我很高兴看到与其他“我们保持最新状态”的链接。讨论从时间弹出时间
DenysSéguret13年

有什么阻止您执行v := &(0)和跳过temp变量的操作吗?(我不知道。)
Alex Feinman

3
@AlexFeinman因为0是文字常量,所以不能使用其地址。如果您也想要特定的类型,则会出现问题。这就是为什么类似&int&int(0)可能有用的语法的原因(尽管对最佳语法没有太多考虑)。但是,如Collins所示,分两行进行也是可以的(vv := 0; v := &vv)。
DenysSéguret13年

14
“因为我们要等到Go 2才能将其淘汰”……众所周知,这将永远不会发生,因为它Go 2被认为是有害的。
梅森惠勒

2
@MasonWheeler,您差点杀了我...仍然在嘲笑“ Go 2被认为是有害的” ...奇怪的是,我今天在午餐时谈论那篇文章。
Daniela Petruzalek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.