Operator przypisania w języku Go

84

Ostatnio bawiłem się nowym językiem programowania Google Go

i zastanawiał się, dlaczego operator przypisania :=ma dwukropek przed znakiem równości = Czy jest jakiś szczególny powód, dla którego autorzy języka chcieli używać name := "John"zamiastname = "John"

Nenad
źródło
Świetne pytanie i odpowiedź brzmi, że użycie znaku = dla przypisania jest błędem. Wcześnie nauczyłeś się, że x + 2 = 4 to równanie, a nie zadanie. Jednakże, ponieważ przypisanie jest znacznie częstsze niż sprawdzanie równości, niektóre dominujące języki zaczęły używać "=" do przypisywania wcześnie ... i konwencja utknęła.
Rick O'Shea

Odpowiedzi:

121

:=Notacja służy zarówno jako zgłoszenie i jak inicjalizacji.

foo := "bar"

jest równa

var foo = "bar"

foo = "bar"Możesz zapytać, dlaczego nie używać tylko tak, jak w każdym języku skryptowym? Cóż, żeby uniknąć literówek.

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?
Fabien
źródło
41
name := "John"

jest tylko cukrem syntaktycznym

var name string
name = "John"

Go jest wpisywane statycznie, więc musisz zadeklarować zmienne.

Joonazan
źródło
7
name := "John"jest skrótem od var name = "John".
peterSO
15
@peterSO, ale var name = "John"jest skrótem dla var name string = "John"dwóch podanych linii.
Dave C
2
@Dave C: Specyfikacja języka programowania Go jest wyraźna: "Krótka deklaracja zmiennej ... jest skrótem dla zwykłej deklaracji zmiennej z wyrażeniami inicjalizującymi, ale bez typów: "var" IdentifierList = ExpressionList .".
peterSO
7
@peterSO Wiem, też to czytałem. To nie zmienia tego, co powiedziałem. Ta odpowiedź jest poprawna.
Dave C
1
@KennethWorden Jak to utrudnia czytelność? Minimalizuje niepotrzebne informacje. Języki z pełnym wnioskiem o typie są dobrym przykładem tego, dlaczego jest to dobre.
Joonazan
19

:=nie jest operatorem przypisania. To krótka deklaracja zmiennej. =jest operatorem przypisania.

Krótkie deklaracje zmiennych

Krótka deklaracja zmiennej wykorzystuje składnię:

ShortVarDecl = IdentifierList ":=" ExpressionList .

Jest to skrót dla zwykłej deklaracji zmiennej z wyrażeniami inicjalizującymi, ale bez typów:

"var" IdentifierList = ExpressionList .

Zadania

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

In Go name := "John"to skrót od var name = "John".

peterSO
źródło
11

Rob Pike wyjaśnia, dlaczego Go :=przemówił w swoim wykładzie „Origins of Go” (2010).

:=był pseudo operatorem w innym języku oznaczonym przez Pike'a o nazwie Newsquek (1989). Który miał notację Pascala i zdolność wnioskowania typu dla deklarowania i inicjalizacji idiomu ( strona 15 )

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

Uwaga na marginesie: Robert Griesemer wywołuje := operatora, odpowiadając na pytanie „Jaka byłaby jedna rzecz, którą wyciągniesz z Go?” podczas sesji QA na Google I / O 2013. Powoływanie się na to jako wygodne, ale problematyczne .

user2418306
źródło
4

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

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

I

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

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

Przeczytaj poniżej, aby uzyskać szczegółowe informacje:

Deklaracje zmiennych

Krótkie deklaracje zmiennych

Pravin Mishra
źródło
4

Jest przynajmniej jedna subtelna różnica między

name := "John"

i

var name = "John"

Pierwsza jest instrukcją niezgłoszoną i niedozwoloną poza treścią funkcji, podczas gdy druga jest prawidłową instrukcją na poziomie pakietu.

Maria S.
źródło
2

Ważny kontekst odpowiedzi:

:=jest operatorem skrótu do inicjalizacji zmiennej. W Go następujące operacje są równoważne:

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

Odpowiedź:

Domniemane pytanie brzmi teraz: „Dlaczego zaprojektowano notację skróconą, :=aby mieć :przed sobą a =?”. Powodem jest zapobieganie powszechnym literówkom. Gdyby operator przypisania skróconego miał postać just =, mogłaby wystąpić następująca sytuacja:

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

Czy użytkownik, który utworzył ten kod, zamierzał przypisać twogo ponownie myNumb, czy też pomylił się, myNumbzamiast poprawnie pisać myNumbTwo? Włączając dwukropek :=, programista musiałby popełnić dwa błędy (zapomnieć o dwukropku i zapomnieć o var), aby mieć błąd, a tym samym drastycznie zmniejszyć prawdopodobieństwo zrobienia tego .

Webeng
źródło