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

W Go, jaka jest różnica między operatorem = i :=? Oboje są do zadania? To może być oczywiste, ale nie mogę tego znaleźć w dokumentach.

 165
go
Author: Tim Cooper, 2013-07-27

9 answers

Tylko = jest operatorem przypisania.

:= w rzeczywistości nie jest operatorem w ogóle. Jest to część składni klauzuli Short variable declarations .

 136
Author: zzzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 21:25:21

W Go, {[0] } jest dla deklaracji + przypisanie, podczas gdy = jest tylko dla przypisania.

Na przykład, var foo int = 10 jest tym samym co foo := 10.

 144
Author: Chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-20 16:30:54

Jak już inni wyjaśnili, {[7] } jest zarówno deklaracją, jak i przypisaniem i próbuje odgadnąć (wywnioskować) typ zmiennej automatycznie.

To krótka forma:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

Niektóre zasady

Nie możesz użyć := z funcs.

illegal := 42

func foo() {
  legal := 42
}

Nie możesz użyć ich dwa razy:

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

Ponieważ, := wprowadza "nową zmienną" , dlatego użycie jej dwa razy nie powoduje ponownego zapisania drugiej zmiennej, więc jest nielegalne.


Można jednak użyć ich dwukrotnie w "deklaracjach wielowarstwowych", 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 zmieniasz zmiennych, po prostu przypisujesz nowe wartości do istniejących zmiennych, z nowymi zmiennymi.


Możesz ich użyć, jeśli zmienna już wcześniej zadeklarowana o tej samej nazwie:

var foo int = 34

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

Tutaj, foo := 42 jest legalne, ponieważ, to redeclares foo w some() luneta func. foo = 314 jest legalne, ponieważ po prostu przypisuje nową wartość foo.

_


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

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

_


Możesz użyć ich ponownie w kontekstach takich jak: jeśli, na, przełącznik :

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

Ponieważ, if foo := ... przypisanie, dostępne tylko dla tego if klauzuli.


Więc, zgodnie z ogólną zasadą: chyba że jesteś ponowne zadeklarowanie zmiennej można użyć :=, lub, jeśli chcesz nadpisać istniejącą wartość, można użyć =.

 26
Author: Inanc Gumus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-13 19:22:53

:= jest skrótem do deklaracji.

a := 10
b := "gopher"

a zostanie zadeklarowana jako int i zainicjalizowana wartością 10 gdzie jako b zostanie zadeklarowana jako łańcuch znaków i zainicjalizowana wartością gopher.

Ich odpowiednikami przy użyciu = będą

var a = 10
var b = "gopher"

= jest operatorem przypisania. Jest używany w ten sam sposób, w jaki można go używać w każdym innym języku.

Możesz pominąć Typ, gdy zadeklarujesz zmienną i jest obecny inicjalizator ( http://tour.golang.org/#11).

 18
Author: ShuklaSannidhya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-27 06:19:31

:= deklaruje i przydziela, = po prostu przydziela

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

// 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)
 9
Author: Gustav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 21:28:36

: = oznacza zadeklarować i przypisać, podczas gdy = oznacza po prostu przypisać.

 8
Author: Ralph Caraveo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 21:25:49

Z dokumentu referencyjnego: ( tour.golang.org )

Wewnątrz funkcji , krótka instrukcja przypisania := może być użyta zamiast deklaracji var z typem niejawnym.

Poza funkcją , każdy konstrukt zaczyna się od słowa kluczowego (var, func, itd.), a := construct nie jest dostępny.

 6
Author: subhash kumar singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 08:05:18

":= " służy do wykonywania deklaracji i inicjalizacji w tym samym czasie, poniżej znajduje się przykład.

Użycie "= "

Var i int

I = 10

Https://play.golang.org/p/RU88ty_SGa

Użycie": = "

I: = 10

Https://play.golang.org/p/XBdjBh-DQB

 2
Author: Nisal Edu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 04:22:45

Obie są inną techniką deklaracji zmiennych w języku Go.

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

I

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

Krótka deklaracja zmiennej jest skrótem zwykłej deklaracji zmiennej z wyrażeniami inicjalizującymi, ale bez typów.

Czytaj poniżej, aby poznać szczegóły:

Deklaracje zmiennych

Krótkie deklaracje zmiennych

 1
Author: Pravin Mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 01:12:41