Оператор присваивания на языке Go


84

В последнее время я играл с новым языком программирования Google Go

и задавался вопросом, почему у оператора присваивания :=стоит двоеточие перед знаком равенства. = Есть ли особая причина, по которой авторы языка хотели использовать name := "John"вместоname = "John"


Отличный вопрос, и ответ заключается в том, что использование = для присваивания является ошибкой. Вы рано узнали, что x + 2 = 4 - это уравнение, а не задание. Однако, поскольку присваивание выполняется гораздо чаще, чем проверка на равенство, некоторые доминирующие языки начинали с использования символа «=» для раннего присваивания ... и это соглашение прижилось.
Рик О'Ши

Ответы:


121

:=Обозначение служит и в качестве декларации и как инициализация.

foo := "bar"

эквивалентно

var foo = "bar"

foo = "bar"Вы можете спросить, почему бы не использовать только подобные на любом языке сценариев? Что ж, чтобы не было опечаток.

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?

41
name := "John"

просто синтаксический сахар для

var name string
name = "John"

Go статически типизирован, поэтому вам нужно объявить переменные.


7
name := "John"это сокращение для var name = "John".
peterSO

15
@peterSO, но var name = "John"это сокращение var name string = "John"от двух указанных строк.
Dave C

2
@Dave C: Спецификация языка программирования Go является явной: «Краткое объявление переменной ... является сокращением для объявления обычной переменной с выражениями инициализатора, но без типов: "var" IdentifierList = ExpressionList .».
peterSO

7
@peterSO Я знаю, я тоже это читал. Это не меняет того, что я сказал. Это правильный ответ.
Dave C

1
@KennethWorden Как это мешает читабельности? Он сводит к минимуму ненужную информацию. Языки с полным выводом типов - хороший пример того, почему это хорошо.
Joonazan

19

:=не является оператором присваивания. Это короткое объявление переменной. =- оператор присваивания.

Краткие объявления переменных

В коротком объявлении переменной используется синтаксис:

ShortVarDecl = IdentifierList ":=" ExpressionList .

Это сокращение для объявления обычной переменной с выражениями инициализатора, но без типов:

"var" IdentifierList = ExpressionList .

Задания

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

В Go name := "John"это сокращение от var name = "John".


11

Роб Пайк объясняет, почему Го говорит, :=во время своего выступления «Истоки го» (2010).

:=был псевдооператором на другом языке, подписанным Пайком и названным Newsquek (1989). Который имел нотацию в стиле Паскаля и способность определять тип для объявления и инициализации идиомы ( стр. 15 )

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

Примечание на полях : Роберт Гриземер вызывает := оператора, отвечая на вопрос: «Что бы вы взяли из Go?» во время QA-сессии на Google I / O 2013. Называть это удобным, но проблематичным .


4

Оба являются разными методами объявления переменных в языке Go.

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

И

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

Краткое объявление переменной - это сокращение для объявления обычной переменной с выражениями инициализатора, но без типов.

Подробнее читайте ниже:

Объявления переменных

Краткие объявления переменных


4

Есть по крайней мере одно тонкое различие между

name := "John"

и

var name = "John"

Первый является оператором без объявления и не допускается за пределами тела функции, тогда как последний является допустимым оператором на уровне пакета.


2

Важный контекст для ответа:

:=- сокращенный оператор для инициализации переменной. В Go следующие операции эквивалентны:

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

Ответ:

Подразумевается вопрос: «Почему мы разработали сокращенную запись так, :=чтобы она была :перед =?». Причина в том, чтобы предотвратить распространенные опечатки. Если бы сокращенный оператор присваивания был справедливым =, у вас могла бы быть следующая ситуация:

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

Собирался ли пользователь, создавший этот код, переназначить twoего myNumb, или он набрал опечатку myNumbвместо того, чтобы правильно набрать myNumbTwo? Включив двоеточие :=, программист должен был бы совершить две ошибки (забыть двоеточие и забыть var), чтобы получить ошибку, что резко снизит вероятность этого .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.