La meilleure façon de demander est probablement aux personnes qui y travaillent; exactement ce que j'ai fait !
Tl; dr: il était là à l' origine avant make
et &{}
, et il est toujours la fonction à utiliser dans certaines situations.
En gros, voici les parties les plus importantes citées:
Alors, quel est le raisonnement derrière le nouveau? Est-ce quelque chose d'utile? Devrions-nous l'utiliser?
Vous ne pouvez pas faire cela sans nouveau
v := new(int)
*v++
fmt.Println(*v)
new ne fait pas partie des titres de Go, vous ne le trouverez pas souvent, mais vous en aurez besoin quand vous en aurez besoin.
À votre santé
Dave
Après une autre réponse montrant ce genre de solution:
vv := 0
v := &vv
*v++
fmt.Println(*v)
J'ai demandé des précisions supplémentaires:
Donc, fondamentalement, le point de Dave ne tient pas vraiment?
Il y a des endroits où il n'est pas pratique d'insérer une nouvelle variable simplement pour prendre son adresse.
new (T) a une signification immédiate, au lieu d'être un idiome à plusieurs étapes.
Le point de Dave ne tombe que si la simple possibilité technique (de s'en passer
new
) est convaincante en soi.
N'a-t-on pas discuté de cela parce qu'il était évident que Go devrait l'avoir, car presque toutes les langues l'ont?
Le "doit-on garder new
?" la discussion apparaît de temps en temps. Puisque nous ne pouvons pas sortir avant Go 2, si je comprends bien la promesse, il ne semble pas y avoir grand-chose à faire en faisant un tour complet. au moment où Go 2 est pensable, nous pourrions avoir des idées différentes et meilleures ...
Chris
C'est aussi là principalement pour des raisons historiques:
vous devez prendre en compte l'historique du projet. Je pense que le nouveau est introduit avant qu'il y ait make.
C'est vrai. En fait, nous avons lutté pendant un moment avant de proposer l’idée de make. Si vous consultez les journaux du référentiel, vous remarquerez que make n'apparaît qu'en janvier 2009, révision 9a924177598f.
La nouvelle fonction intégrée a également précédé l’idée de & {} pour prendre l’adresse d’un littéral composite (et cette syntaxe est en quelque sorte fausse; elle devrait probablement être (* T) {champs de T} mais il n’y avait pas assez raison de le changer).
La nouvelle fonction n’est pas strictement nécessaire, mais le code semble l’utiliser dans la pratique. Il est difficile de s'en débarrasser à ce stade.
Ian