Je suis toujours perplexe quant à pourquoi nous avons new
dans Go.
Quand vous voulez instancier une structure, vous faites
t := Thing{}
et vous pouvez obtenir un pointeur sur une nouvelle instance en faisant
t := &Thing{}
Mais il y a aussi cette possibilité:
t := new(Thing)
Ce dernier semble un peu étranger au reste de la langue. &Thing{}
est aussi clair et concis que new(Thing)
et utilise uniquement les constructions que vous utilisez souvent ailleurs. Il est également plus extensible que vous pourriez le changer en &Thing{3}
ou &Thing{Feets:7}
.
À mon avis, un mot clé supplémentaire 1 est coûteux, cela rend le langage plus complexe et ajoute à ce que vous devez savoir. Et cela pourrait masquer aux nouveaux arrivants ce qu'il y a derrière l'instanciation d'une structure.
Cela fait aussi un mot réservé.
Alors, quel est le raisonnement derrière new
? Est-ce parfois utile? Devrions-nous l'utiliser?
1 : Oui, je sais que ce n'est pas un mot-clé au niveau de la grammaire, vous pouvez l'observer , mais cela ne change rien au fait qu'il s'agisse d'un mot réservé pour le développeur raisonnable.
Réponses:
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:
Après une autre réponse montrant ce genre de solution:
J'ai demandé des précisions supplémentaires:
C'est aussi là principalement pour des raisons historiques:
la source
v := &(0)
et de sauter la variable temporaire? (Je ne sais pas Go.)0
s'agit d'une constante littérale, vous ne pouvez pas prendre son adresse. Un problème peut survenir si vous souhaitez également un type spécifique. C’est pourquoi une syntaxe similaire&int
ou&int(0)
susceptible de s’avérer utile (n’a cependant pas beaucoup réfléchi à la meilleure syntaxe). Mais le faire en deux lignes, comme l'a montré Collins, convient également (vv := 0; v := &vv
).Go 2
considéré comme dangereux.