Warum gibt es ein "neues" in Go?

49

Ich bin immer noch verwirrt, warum wir newin Go haben.

Wenn Sie eine Struktur instanziieren möchten, müssen Sie dies tun

t := Thing{}

und Sie können einen Zeiger auf eine neue Instanz erhalten, indem Sie tun

t := &Thing{}

Es gibt aber auch diese Möglichkeit:

t := new(Thing)

Letzteres scheint dem Rest der Sprache ein wenig fremd zu sein. &Thing{}ist so klar und prägnant wie new(Thing)und verwendet nur Konstrukte, die Sie an anderer Stelle häufig verwenden. Es ist auch erweiterbarer, wenn Sie es in &Thing{3}oder ändern &Thing{Feets:7}.

Meiner Meinung nach ist ein zusätzliches Schlüsselwort 1 teuer, macht die Sprache komplexer und ergänzt das, was Sie wissen müssen. Und es kann Neulingen verborgen bleiben, was dahinter steckt, eine Struktur zu instanziieren.

Es macht auch noch ein reserviertes Wort.

Was steckt dahinter new? Ist es manchmal nützlich? Sollen wir es benutzen?


1 : Ja, ich weiß, es ist kein Schlüsselwort auf Grammatikebene, Sie können es auch schattieren , aber das ändert nichts an der Tatsache, dass es für den vernünftigen Entwickler ein reserviertes Wort ist.

Denys Séguret
quelle
3
"... to Go Codierer ..." - das ist der Grund. F # / Haskell / etc. sind C-Entwicklern sehr fremd und deshalb bekommen sie eine Traktion von ~ 0. Scala bemühte sich und jetzt ist es zugänglicher und gehört.
Den
12
Aus dem gleichen Grund sind Python und Ruby C-Entwicklern sehr fremd, da sie eine Reihe unbekannter Schlüsselwörter, "seltsame" syntaktische Regeln (wo sind geschweifte Klammern?) Und seltsame semantische Konzepte (Generatoren? Metaklassen? Dekoratoren?) Verwenden. Trotzdem bekommen sie keine Traktion, ganz im Gegenteil.
Xion
8
@Xion: Hast du dir die anfängliche Wachstumsrate von Ruby angesehen? Es hat ewig gedauert, bis wir dort waren, wo wir jetzt sind (18 Jahre, um genau zu sein). Python ist noch älter (1991!).
Joachim Sauer
2
@AndresF. Ein Teil des Widerstandes gegen Scala könnte nichts mit der Sprache zu tun haben. Als jüngerer Programmierer (25) erinnere ich mich an eine Kreuzung zwischen einer mathebasierten Sprache wie Matlab (an die ich schlechte Erinnerungen habe) und einer wirklich alten wie Fortran. Es gab noch nie den Drang, sich das überhaupt anzuschauen.
Izkata
4
Eine Randnotiz: Neu ist in Go kein Schlüsselwort. Es ist eine eingebaute Funktion.
Manish Malik

Antworten:

44

Die beste Art zu fragen ist wahrscheinlich die, die daran arbeiten. genau das, was ich getan habe !

Tl; dr: Es war ursprünglich vor makeund da &{}, und es ist immer noch die Funktion, die in einigen Situationen verwendet werden muss.

Grundsätzlich sind hier die wichtigsten Teile zitiert:

Was ist der Grund für Neues? Ist es etwas nützliches? Sollen wir es benutzen?

Sie können dies nicht ohne neue tun

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

new ist keine Schlagzeile von Go, sie wird nicht oft verwendet, aber wenn Sie sie brauchen, ist sie da.

Prost

Dave

Nach einer weiteren Antwort, die diese Art von Lösung zeigt:

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

Ich bat um weitere Klarstellung:

Im Grunde genommen steht Daves Standpunkt also nicht wirklich?

Es gibt Stellen, an denen es unpraktisch ist, eine neue Variable einzuschleusen, um ihre Adresse zu ermitteln.

new (T) hat eine sofort eindeutige Bedeutung, anstatt eine mehrstufige Redewendung zu sein.

Daves Argument fällt nur dann weg, wenn die bloße technische Möglichkeit (Verzicht new) für sich allein zwingend ist.

Wurde dies nicht diskutiert, weil es nur offensichtlich war, dass Go es haben sollte, weil es in fast jeder Sprache verfügbar ist?

Das "sollen wir behalten new?" von Zeit zu Zeit taucht eine Diskussion auf. Da wir es erst mit Go 2 herausnehmen können, scheint es, wenn ich das Versprechen richtig verstehe, nicht viel zu geben, wenn wir die Runde noch einmal drehen. Bis Go 2 denkbar ist, haben wir vielleicht ein paar andere und bessere Ideen ...

Chris

Es ist auch hauptsächlich aus historischen Gründen dort:

Sie müssen die Geschichte des Projekts berücksichtigen. Ich denke, neues wird zuerst vorgestellt, bevor es make gibt.

Das ist wahr. Tatsächlich hatten wir eine Weile Mühe, bevor wir auf die Idee kamen, Make zu machen. Wenn Sie sich die Repository-Protokolle ansehen, sehen Sie, dass make nur im Januar 2009 angezeigt wird, Revision 9a924177598f.

Die neue eingebaute Funktion ging auch der Idee von & {} voraus, die Adresse eines zusammengesetzten Literal zu übernehmen (und diese Syntax ist in gewissem Sinne falsch; es sollte wahrscheinlich (* T) {Felder von T} geben, aber es gab nicht genug Grund, es zu ändern).

Die neue Funktion ist nicht unbedingt erforderlich, aber Code scheint sie in der Praxis zu verwenden. Es ist schwer, es an diesem Punkt loszuwerden.

Ian

Florian Margaine
quelle
Ich würde mich freuen, Links zu den anderen zu sehen "Sollen wir uns auf dem Laufenden halten?" Diskussionen, die von Zeit zu Zeit auftauchen .
Denys Séguret
Verhindert etwas, dass Sie v := &(0)die temporäre Variable ausführen und überspringen? (Ich weiß nicht Go.)
Alex Feinman
3
@AlexFeinman Da 0es sich um eine wörtliche Konstante handelt, können Sie ihre Adresse nicht übernehmen. Ein Problem würde auftreten, wenn Sie auch einen bestimmten Typ möchten. Das ist der Grund, warum eine Syntax wie &intoder &int(0)nützlich sein könnte (dachte aber nicht viel über die beste Syntax nach). Aber es ist auch in Ordnung, es in zwei Zeilen zu machen, wie Collins gezeigt hat ( vv := 0; v := &vv).
Denys Séguret
14
"Da wir es nicht bis Go 2 herausnehmen können" ... was, wie jeder weiß, niemals passieren wird, weil Go 2es als schädlich angesehen wird.
Mason Wheeler
2
@ MasonWheeler du hast mich fast umgebracht ... lachst immer noch über "Go 2 als schädlich" ... seltsamerweise habe ich heute beim Mittagessen über diesen Artikel gesprochen.
Daniela Petruzalek