Zuweisungsoperator in der Sprache Go

82

In letzter Zeit habe ich mit Googles neuer Programmiersprache Go gespielt

und fragte sich, warum der Zuweisungsoperator :=einen Doppelpunkt vor dem Gleichheitszeichen hat. = Gibt es einen bestimmten Grund, warum die Autoren der Sprache name := "John"anstelle von verwenden wollten ?name = "John"

Nenad
quelle
Gute Frage und die Antwort ist, dass die Verwendung von = für die Zuweisung ein Fehler ist. Sie haben früh gelernt, dass x + 2 = 4 eine Gleichung ist, keine Aufgabe. Da die Zuweisung jedoch weitaus häufiger ist als die Überprüfung der Gleichheit, haben einige dominante Sprachen frühzeitig "=" für die Zuweisung verwendet ... und die Konvention blieb bestehen.
Rick O'Shea

Antworten:

120

Die :=Notation dient sowohl als Deklaration als auch als Initialisierung.

foo := "bar"

ist äquivalent zu

var foo = "bar"

Warum nicht nur foo = "bar"wie in einer beliebigen Skriptsprache verwenden? Nun, das ist, um Tippfehler zu vermeiden.

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?
Fabien
quelle
38
name := "John"

ist nur syntaktischer Zucker für

var name string
name = "John"

Go ist statisch typisiert, daher müssen Sie Variablen deklarieren.

Joonazan
quelle
6
name := "John"ist eine Abkürzung für var name = "John".
PeterSO
13
@peterSO ist aber var name = "John"kurz, var name string = "John"was für die beiden angegebenen Zeilen kurz ist.
Dave C
2
@ Dave C: Die Go-Programmiersprachenspezifikation ist explizit: "Eine kurze Variablendeklaration ... ist eine Abkürzung für eine reguläre Variablendeklaration mit Initialisiererausdrücken, aber ohne Typen: "var" IdentifierList = ExpressionList .".
PeterSO
7
@ PeterSO Ich weiß, das habe ich auch gelesen. Das ändert nichts an dem, was ich gesagt habe. Diese Antwort ist richtig.
Dave C
1
@KennethWorden Wie behindert es die Lesbarkeit? Es minimiert unnötige Informationen. Sprachen mit vollständiger Typinferenz sind ein gutes Beispiel dafür, warum dies eine gute Sache ist.
Joonazan
18

:=ist nicht der Zuweisungsoperator. Es ist eine kurze Variablendeklaration. =ist der Zuweisungsoperator.

Kurze Variablendeklarationen

Eine kurze Variablendeklaration verwendet die folgende Syntax:

ShortVarDecl = IdentifierList ":=" ExpressionList .

Es ist eine Abkürzung für eine reguläre Variablendeklaration mit Initialisiererausdrücken, aber ohne Typen:

"var" IdentifierList = ExpressionList .

Zuordnungen

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

In Go name := "John"ist Abkürzung für var name = "John".

peterSO
quelle
11

Rob Pike erklärt, warum Go :=während seines Vortrags "Origins of Go" (2010) hat.

:=war ein Pseudooperator in einer anderen von Pike codierten Sprache namens Newsquek (1989). Welches hatte Pascal-ish Notation und die Fähigkeit, Typ für die Deklaration und Initialisierung der Sprache abzuleiten ( Seite 15 )

// variable: [type] = value
x: int = 1
x := 1

Randnotiz: Robert Griesemer spricht den := Operator an und beantwortet die Frage "Was würden Sie aus Go herausnehmen?" während der QS-Sitzung bei Google I / O 2013. Als praktisch, aber problematisch bezeichnet .

user2418306
quelle
4

Beides ist die unterschiedliche Technik der Variablendeklaration in der Go-Sprache.

var name = "John" // is a variable declaration 

UND

name := "John"   // is a short variable declaration. 

Eine kurze Variablendeklaration ist eine Abkürzung für eine reguläre Variablendeklaration mit Initialisiererausdrücken, aber ohne Typen.

Lesen Sie unten für Details:

Variablendeklarationen

Kurze Variablendeklarationen

Pravin Mishra
quelle
4

Es gibt mindestens einen subtilen Unterschied zwischen

name := "John"

und

var name = "John"

Ersteres ist eine Nichtdeklarationsanweisung und außerhalb eines Funktionskörpers nicht zulässig, während letzteres eine gültige Anweisung auf Paketebene ist.

maria s
quelle
2

Wichtiger Kontext für die Antwort:

:=ist ein Kurzoperator zum Initialisieren einer Variablen. In Go sind die folgenden Operationen äquivalent:

var myNumb String = "one"
myNumb := "one"

Antworten:

Die implizite Frage lautet nun: "Warum hat go die Kurzschreibweise so entworfen :=, dass sie :vor dem steht =?". Der Grund ist, häufige Tippfehler zu vermeiden. Wenn der Kurzzuweisungsoperator nur war =, könnte die folgende Situation auftreten:

var myNumb String = "one"
myNumb = "two"

Nun hat der Benutzer, der diesen Code erstellt beabsichtigt neu zuweisen twozu myNumb, oder hat er falsch eingeben , myNumbanstatt richtig tippen myNumbTwo? Durch das Einfügen des Doppelpunkts in :=müsste der Programmierer zwei Fehler begehen (den Doppelpunkt vergessen und den vergessen var), um einen Fehler zu erhalten, wodurch die Wahrscheinlichkeit drastisch verringert wird .

Webeng
quelle