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"
Odpowiedzi:
:=
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' ?
źródło
name := "John"
jest tylko cukrem syntaktycznym
var name string name = "John"
Go jest wpisywane statycznie, więc musisz zadeklarować zmienne.
źródło
name := "John"
jest skrótem odvar name = "John"
.var name = "John"
jest skrótem dlavar name string = "John"
dwóch podanych linii."var" IdentifierList = ExpressionList .
".:=
nie jest operatorem przypisania. To krótka deklaracja zmiennej.=
jest operatorem przypisania.In Go
name := "John"
to skrót odvar name = "John"
.źródło
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 .źródło
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
źródło
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.
źródło
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ć
two
go ponowniemyNumb
, czy też pomylił się,myNumb
zamiast poprawnie pisaćmyNumbTwo
? Włączając dwukropek:=
, programista musiałby popełnić dwa błędy (zapomnieć o dwukropku i zapomnieć ovar
), aby mieć błąd, a tym samym drastycznie zmniejszyć prawdopodobieństwo zrobienia tego .źródło