Różnica między: = i = operatorami w Go

283

Jaka jest różnica między =i :=operatorów, a jakie są przypadki użycia dla nich? Oboje wydają się być na zlecenie?

Chris
źródło
2
Zobacz także : Przewodnik wizualny Go Variables . Napisałem o tym artykuł.
Inanc Gumus,
1
Semantyka ...
JustDave
Jeśli chcesz użyć określonego typu x := uint32(123)działa na przykład. To musi być oczywiste dla większości ludzi, ale musiałem pomyśleć kilka minut ;-)
Kenji Noguchi

Odpowiedzi:

198

Tylko =operator przypisania.

:=jest częścią składni klauzuli Krótkie deklaracje zmiennych .

👉 Istnieją jednak pewne zasady. Zobacz tę inną odpowiedź, aby uzyskać więcej informacji.

zzzz
źródło
więc czy to oznacza zmienną z wywnioskowanym typem? dobrze?
Krupal Shah
@KrupalShah link do dokumentów dosłownie mówi, że: „Jest to skrót od zwykłej deklaracji zmiennej z wyrażeniami inicjalizującymi, ale bez typów:” golang.org/ref/spec#Short_variable_declarations
akshaynagpal
1
Wygląda na :=to, że jest tutaj wymieniony jako operator golang.org/ref/spec#Operators_and_punctuation , więc nie jestem pewien, czy zgadzam się, że „ :=tak naprawdę nie jest operatorem”
Powers
347

W Go :=służy do deklaracji + przypisania, natomiast =dotyczy tylko przypisania.

Na przykład var foo int = 10 jest taki sam jak foo := 10.

Chaos
źródło
4
Czy istnieje przypadek użycia =zamiast :=? Czy powinieneś zawsze używać :=?
Kenny Worden
3
@KennethWorden Go nie pozwala :=na przypisanie do zmiennej, która została już zadeklarowana, chyba że przypisujesz wiele zmiennych jednocześnie, a przynajmniej jedna z tych zmiennych jest nowa.
Kenny Bania
5
intnie jest wymagane, var foo = 10jest taka sama jakfoo := 10
Gary Lyn
@KennyWorden, tak. Nie możesz użyć: = poza funkcją.
Karuhanga,
105

Jak już wyjaśnili inni, dotyczy :=to zarówno deklaracji, cesji, jak i redeklaracji; i automatycznie zgaduje ( wnioskuje ) typ zmiennej.

Na przykład foo := 32jest krótką formą:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Istnieją pewne zasady: * /

★ 1. reguła:

Nie możesz użyć :=z funcs. Wynika to z faktu, że z dowolnej funkcji instrukcja powinna zaczynać się od słowa kluczowego.

// 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. reguła:

Nie możesz ich użyć dwa razy ( w tym samym zakresie ):

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

Ponieważ :=wprowadza „nową zmienną” , a zatem dwukrotne użycie jej nie powoduje ponownego uzgodnienia drugiej zmiennej, więc jest to nielegalne.


★ trzecia reguła:

Możesz ich używać do deklaracji i przypisań o wielu zmiennych:

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

★ Czwarta reguła (Deklaracja):

Możesz użyć ich dwa razy w deklaracjach „wielu zmiennych” , jeśli jedna ze zmiennych jest nowa :

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

Jest to legalne, ponieważ nie deklarujesz wszystkich zmiennych, po prostu przypisujesz nowe wartości do istniejących zmiennych i deklarujesz nowe zmienne w tym samym czasie. Nazywa się to deklaracją .


★ 5 reguła:

Możesz użyć krótkiej deklaracji, aby zadeklarować zmienną w nowszym zakresie, nawet jeśli ta zmienna była już wcześniej zadeklarowana pod tą samą nazwą:

var foo int = 34

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

Tutaj foo := 42jest legalne, ponieważ deklaruje foow zakresie some()func. foo = 314jest legalne, ponieważ po prostu przypisuje nową wartość do foo.


★ 6. reguła:

Możesz zadeklarować tę samą nazwę w krótkich blokach instrukcji, takich jak: if , for , przełącz :

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

Ponieważ foow if foo := ...należy tylko do tej ifklauzuli i ma inny zakres.


Zatem ogólna zasada: jeśli chcesz łatwo zadeklarować zmienną, której możesz użyć :=, lub, jeśli chcesz tylko zastąpić istniejącą zmienną, możesz jej użyć =.

Bibliografia:

Inanc Gumus
źródło
21

:= jest skrótem do deklaracji.

a := 10
b := "gopher"

azostanie zadeklarowany jako inti zainicjowany wartością, 10gdzie as bzostanie zadeklarowany jako ciąg i zainicjowany wartością gopher.

Ich odpowiednikami =byłyby

var a = 10
var b = "gopher"

=jest operatorem przypisania. Jest używany w taki sam sposób, jak w innym języku.

Możesz pominąć ten typ, kiedy deklarujesz zmienną i obecny jest inicjalizator ( http://tour.golang.org/#11 ).

ShuklaSannidhya
źródło
«= Jest operatorem przypisania. Używa się go w taki sam sposób, jak w innym języku. » Z wyjątkiem Ady, gdzie =jest tylko dla porównania i :=do zadania ...
Alexis Wilke
13

: = Oznacza deklarowanie i przypisywanie, podczas gdy = oznacza po prostu przypisywanie.

Ralph Caraveo
źródło
11

:=deklaruje i przypisuje, =po prostu przypisuje

Jest to przydatne, gdy nie chcesz wypełniać kodu deklaracjami typu lub struct.

// 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)
Gustav
źródło
7

z dokumentu referencyjnego: ( tour.golang.org )

Wewnątrz funkcji The :=krótkie oświadczenie przypisanie może być stosowany w miejsce deklaracji var z niejawnego typu.

Poza funkcją każdy konstrukt zaczyna się słowem kluczowym (var, func itd.), A konstrukcja: = nie jest dostępna.

Subhash Kumar Singh
źródło
2

Oba są różnymi technikami deklaracji zmiennych w języku Go.

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

I

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

Deklaracja krótkiej zmiennej jest skrótem dla deklaracji zmiennej regularnej z wyrażeniami inicjalizującymi, ale bez typów.

Szczegóły poniżej:

Deklaracje zmienne

Krótkie deklaracje zmiennych

Pravin Mishra
źródło
10
Myślę, że twoja składnia jest niepoprawna dla pierwszego przykładu. Zamiast: var firstName: = "John", powinno być: var firstName = "John"
Gino