Оператор присвоєння мовою Go


83

Останнім часом я грав з новою мовою програмування Google Go

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


Чудове запитання і відповідь полягає в тому, що використання = для призначення є помилкою. Ви рано зрозуміли, що x + 2 = 4 - це рівняння, а не завдання. Однак, оскільки присвоєння набагато частіше, ніж перевірка рівності, деякі домінуючі мови почали використовувати "=" для присвоєння рано ... і конвенція затрималася.
Рік О'Ші,

Відповіді:


120

:=Позначення служить і в якості декларації і як ініціалізація.

foo := "bar"

еквівалентно

var foo = "bar"

Чому б не використовувати лише foo = "bar"як у будь-якій мові сценаріїв, можете запитати? Ну, це щоб уникнути помилок.

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

39
name := "John"

- це просто синтаксичний цукор для

var name string
name = "John"

Go набирається статично, тому вам потрібно оголосити змінні.


6
name := "John"це скорочення для var name = "John".
peterSO

13
@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

18

:=не є оператором присвоєння. Це коротке оголошення змінної. =є оператором присвоєння.

Короткі оголошення змінних

Коротке оголошення змінної використовує синтаксис:

ShortVarDecl = IdentifierList ":=" ExpressionList .

Це скорочення для звичайного оголошення змінної з виразами ініціалізатора, але без типів:

"var" IdentifierList = ExpressionList .

Доручення

Assignment = ExpressionList assign_op ExpressionList .

assign_op = [ add_op | mul_op ] "=" .

У Go - name := "John"це скорочення для var name = "John".


11

Роб Пайк пояснює, чому Го має :=під час свого виступу "Origins of Go" (2010).

:=був псевдооператором іншою мовою, кодом якого був підписаний Пайк, який називається Newsquek (1989). Який мав позначення Паскаля та здатність виводити тип для оголошення та ініціалізації ідіоми ( стор. 15 )

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

Примітка на маргіналі: Роберт upріземер виховує := оператора, відповідаючи на запитання "Що б ви взяли з Go?" під час сеансу контролю якості в 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.