В последнее время я играл с новым языком программирования google Go
и задавался вопросом, почему оператор присваивания :=
имеет двоеточие перед знаком равенства =
Есть ли особая причина, по которой авторы языка хотели использовать name := "John"
вместо name = "John"
Ответ 1
Обозначение :=
служит как объявление, так и инициализация.
foo := "bar"
эквивалентно
var foo = "bar"
Почему бы не использовать только foo = "bar"
, как на любом языке сценариев, вы можете спросить? Ну, чтобы избежать опечаток.
foo = "bar"
fooo = "baz" + foo + "baz" // Oops, is fooo a new variable or did I mean 'foo' ?
Ответ 2
name := "John"
- это просто синтаксический сахар для
var name string
name = "John"
Go статически типизирован, поэтому вам нужно объявить переменные.
Ответ 3
:=
не является оператором присваивания. Это краткое объявление переменной. =
- оператор присваивания.
Объявления коротких переменных
Объявление короткой переменной использует синтаксис:
ShortVarDecl = IdentifierList ":=" ExpressionList .
Это сокращение для регулярного объявления переменной с инициализатором выражения, но не типы:
"var" IdentifierList = ExpressionList .
Assignments
Assignment = ExpressionList assign_op ExpressionList .
assign_op = [ add_op | mul_op ] "=" .
В Go, name := "John"
является сокращением для var name = "John"
.
Ответ 4
Rob Pike объясняет, почему Go имеет :=
во время своего выступления "Origins of Go" (2010).
:=
был псевдооператором в другом языке, обозначенном Пайком под названием Newsquek (1989).
Который имел обозначение Pascal-ish и способность выводить тип для объявления и инициализации идиомы (стр. 15)
// variable: [type] = value
x: int = 1
x := 1
Маргинальное примечание: Robert Griesemer вызывает :=
оператор, отвечая на вопрос "Что вы могли бы извлечь из Go?" во время сеанса QA в Google I/O 2013. Ссылаясь на это как удобное, но проблематичное.
Ответ 5
Оба являются различными методами объявления переменных в языке Go.
var name = "John" // is a variable declaration
И
name := "John" // is a short variable declaration.
Объявление короткой переменной является сокращением для объявления регулярной переменной с выражениями инициализатора, но без типов.
Подробнее читайте ниже:
Объявления переменных
Объявления коротких переменных
Ответ 6
Важный контекст для ответа:
:=
- сокращенный оператор для инициализации переменной. В Go следующие операции эквивалентны:
var myNumb String = "one"
myNumb := "one"
Ответ:
Теперь подразумевается вопрос: "Почему дизайн <сокращенно > :=
должен был иметь :
до =
?". Причина заключается в предотвращении распространенных опечаток. Если оператор сокращенного присваивания был просто =
, тогда у вас могла бы быть следующая ситуация:
var myNumb String = "one"
myNumb = "two"
Теперь пользователь, создавший этот код, переназначил two
на myNumb
, или он ошибся myNumb
вместо правильной ввода myNumbTwo
? Включив двоеточие в :=
, программисту пришлось бы совершить две ошибки (забыть двоеточие и забыть var
), чтобы иметь ошибку, следовательно, уменьшая вероятность сделать это решительно.