Unterschied zwischen: = und = Operatoren in Go


283

Was ist der Unterschied zwischen =und :=Operatoren und was sind die Anwendungsfälle für sie? Sie scheinen beide für einen Auftrag zu sein?


2
Siehe auch : Go Variables Visual Guide . Ich habe einen Artikel darüber geschrieben.
Inanc Gumus

1
Die Semantik ...
JustDave

Wenn Sie einen bestimmten Typ verwenden möchten, x := uint32(123)funktioniert dies beispielsweise. Es muss für die meisten Leute offensichtlich sein, aber ich musste ein paar Minuten nachdenken ;-)
Kenji Noguchi

Antworten:


198

Nur =der Zuweisungsoperator.

:=ist Teil der Syntax der Short-Variablendeklarationsklausel .

👉 Es gibt jedoch einige Regeln. Weitere Informationen finden Sie in dieser anderen Antwort .


Bedeutet das also Variable mit abgeleitetem Typ? richtig?
Krupal Shah

@KrupalShah der Link zu den Dokumenten sagt wörtlich: "Es ist eine Abkürzung für eine reguläre Variablendeklaration mit Initialisiererausdrücken, aber ohne Typen:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Sieht so aus, :=als wäre er hier als Operator aufgeführt: golang.org/ref/spec#Operators_and_punctuation , daher bin ich mir nicht sicher, ob ich damit einverstanden bin, dass " :=eigentlich kein Operator ist"
Powers

347

In Go :=ist für Deklaration + Zuweisung, während =nur für Zuweisung.

Zum Beispiel var foo int = 10 ist das gleiche wie foo := 10.


4
Gibt es einen Anwendungsfall für =im Gegensatz zu :=? Solltest du einfach immer benutzen :=?
Kenny Worden

3
Mit @KennethWorden Go können Sie nicht :=einer bereits deklarierten Variablen zuweisen, es sei denn, Sie weisen mehrere Variablen gleichzeitig zu, und mindestens eine dieser Variablen ist neu.
Kenny Bania

5
das intist nicht erforderlich, var foo = 10ist das gleiche wiefoo := 10
Gary Lyn

@ KennyWorden, ja. Sie können nicht verwenden: = außerhalb einer Funktion.
Karuhanga

105

Wie andere bereits erklärt haben, :=gilt dies sowohl für die Erklärung als auch für die Abtretung und auch für die erneute Erklärung; und es errät ( schließt ) automatisch den Typ der Variablen.

Zum Beispiel foo := 32ist eine Kurzform von:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Es gibt einige Regeln: * /

★ 1. Regel:

Sie können nicht :=aus verwenden funcs. Dies liegt daran, dass eine Anweisung aus irgendeinem Grund mit einem Schlüsselwort beginnen sollte.

// no keywords below, illegal.
illegal := 42

// `var` keyword makes this statement legal.
var legal = 42

func foo() {
  alsoLegal := 42
  // reason: it's in a func scope.
}

★ 2. Regel:

Sie können sie nicht zweimal verwenden ( im selben Bereich ):

legal := 42
legal := 42 // <-- error

Denn :=einleitet „eine neue Variable“ , indem es daher nicht zweimal eine zweite Variable ist neu deklarieren, so dass es illegal ist.


★ 3. Regel:

Sie können sie für Deklarationen und Zuweisungen mit mehreren Variablen verwenden:

foo, bar   := 42, 314
jazz, bazz := 22, 7

★ 4. Regel (Neuerklärung):

Sie können sie zweimal in Deklarationen mit mehreren Variablen verwenden , wenn eine der Variablen neu ist :

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new

Dies ist legal, da Sie nicht alle Variablen deklarieren, sondern lediglich den vorhandenen Variablen neue Werte zuweisen und gleichzeitig neue Variablen deklarieren. Dies wird als Neuerklärung bezeichnet .


★ 5. Regel:

Mit der kurzen Deklaration können Sie eine Variable in einem neueren Bereich deklarieren, auch wenn diese Variable bereits zuvor mit demselben Namen deklariert wurde:

var foo int = 34

func some() {
  // because foo here is scoped to some func
  foo := 42  // <-- legal
  foo = 314  // <-- legal
}

Hier foo := 42ist legal, denn es erklärt fooin some()func Anwendungsbereich. foo = 314ist legal, weil es nur einen neuen Wert zuweist foo.


★ 6. Regel:

Sie können denselben Namen in kurzen Anweisungsblöcken deklarieren wie: if , for , switch :

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here

Weil fooin if foo := ...nur zu dieser ifKlausel gehört und sich in einem anderen Bereich befindet.


Grundsätzlich gilt: Wenn Sie eine Variable einfach deklarieren möchten, können Sie sie verwenden :=, oder wenn Sie nur eine vorhandene Variable überschreiben möchten, können Sie sie verwenden =.

Verweise:


21

:= ist eine Abkürzung für die Erklärung.

a := 10
b := "gopher"

awird als deklariert intund mit value initialisiert, 10wobei as bals String deklariert und mit value initialisiert wird gopher.

Ihre Entsprechungen =wären

var a = 10
var b = "gopher"

=ist Zuweisungsoperator. Es wird genauso verwendet, wie Sie es in jeder anderen Sprache verwenden würden.

Sie können den Typ weglassen, wenn Sie die Variable deklarieren und ein Initialisierer vorhanden ist ( http://tour.golang.org/#11 ).


«= Ist Zuweisungsoperator. Es wird genauso verwendet, wie Sie es in jeder anderen Sprache verwenden würden. » Außer in Ada, wo =nur zum Vergleich und :=zur Aufgabe ist ...
Alexis Wilke

13

Das: = bedeutet deklarieren und zuweisen, während das = bedeutet, einfach zuzuweisen.


11

:=deklariert und weist zu, =weist nur zu

Dies ist nützlich, wenn Sie Ihren Code nicht mit Typ- oder Strukturdeklarationen füllen möchten.

// Usage with =
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2

// Usage with :=
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)

7

aus dem Referenzdokument: ( tour.golang.org )

Innerhalb einer Funktion kann die :=kurze Zuweisungsanweisung anstelle einer var-Deklaration mit implizitem Typ verwendet werden.

Außerhalb einer Funktion beginnt jedes Konstrukt mit einem Schlüsselwort (var, func usw.) und das Konstrukt: = ist nicht verfügbar.



2

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

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

UND

firstName := "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


10
Ich denke, Ihre Syntax ist für das erste Beispiel falsch. Anstelle von: var firstName: = "John" sollte es sein: var firstName = "John"
Gino
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.