Різниця між: = і = операторами в Go


283

У чому різниця між =і :=операторами, і які варіанти використання для них? Вони обидва здаються на завдання?


2
Також дивіться це : Візуальний посібник Go Variables . Я написав статтю про це.
Inanc Gumus

1
Семантика ...
JustDave

Якщо ви хочете використовувати певний тип, наприклад, x := uint32(123)працює. Для більшості людей це повинно бути очевидним, але мені довелося подумати кілька хвилин ;-)
Кенджі Ногучі

Відповіді:


198

Тільки =оператор присвоєння.

:=є частиною синтаксису пропозиції коротких змінних оголошень .

👉 Однак є деякі правила. Дивіться цю іншу відповідь для отримання більш детальної інформації.


так це означає змінну з виведеним типом? правильно?
Крупал Шах

@KrupalShah посилання на документи буквально говорить про те, що "Це скорочення для звичайного оголошення змінної з ініціалізаційними виразами, але ніяких типів:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Схоже :=, зазначений тут як оператор golang.org/ref/spec#Operators_and_punctuation , тож я не впевнений, що згоден, що " :=насправді не оператор"
Повноваження

347

У програмі Go :=- призначено для оголошення + призначення, тоді =як призначене лише для призначення.

Наприклад, var foo int = 10 те саме, що foo := 10.


4
Чи існує випадок використання на =відміну від :=? Чи варто завжди використовувати :=?
Кенні Worden

3
@KennethWorden Go не дозволить вам :=призначити змінну, яка вже була оголошена, якщо ви не призначите відразу кілька змінних, і принаймні одна з цих змінних є новою.
Кенні Банія

5
intне потрібно, var foo = 10так само , якfoo := 10
Гері Lyn

@KennyWorden, так. Ви не можете використовувати: = поза функцією.
Каруханга

105

Як уже пояснили інші, :=це як для декларації, привласнення, так і для передекларації; і він автоматично відгадує ( виводить ) тип змінної.

Наприклад, foo := 32 це форма короткої руки:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Є деякі правила: * /

★ 1-е правило:

Ви не можете використовувати :=зfuncs . Це тому, що з будь-якого функціоналу оператор повинен починатися з ключового слова.

// no keywords below, illegal.
illegal := 42

// `var` keyword makes this statement legal.
var legal = 42

func foo() {
  alsoLegal := 42
  // reason: it's in a func scope.
}

★ 2-е правило:

Ви не можете їх використовувати двічі ( в тому ж обсязі ):

legal := 42
legal := 42 // <-- error

Тому що, :=вводячи "нову змінну" , отже, використання її двічі не переосмислює другу змінну, тому це незаконно.


★ 3-е правило:

Ви можете використовувати їх для декларацій та призначень з різними змінними:

foo, bar   := 42, 314
jazz, bazz := 22, 7

★ 4-е правило (передекларація):

Ви можете використовувати їх двічі у "багато змінних" оголошеннях, якщо одна із змінних нова :

foo, bar  := someFunc()
foo, jazz := someFunc()  // <-- jazz is new
baz, foo  := someFunc()  // <-- baz is new

Це законно, адже ви не декларуєте всі змінні, ви просто перепризначаєте нові значення існуючим змінним і одночасно декларуєте нові змінні. Це називається передекларацією .


★ 5 правило:

Ви можете використовувати коротку декларацію, щоб оголосити змінну в більш новій області, навіть якщо ця змінна вже була оголошена тим самим ім'ям:

var foo int = 34

func some() {
  // because foo here is scoped to some func
  foo := 42  // <-- legal
  foo = 314  // <-- legal
}

Ось, foo := 42це законно, тому що, він заявляє fooв області some()функцій. foo = 314є законним, оскільки він просто присвоює нове значення foo.


★ 6 правило:

Ви можете оголосити те саме ім'я в блоках коротких висловлювань, як: if , for , switch :

foo := 42
if foo := someFunc(); foo == 314 {
  // foo is scoped to 314 here
  // ...
}
// foo is still 42 here

Тому що, fooв if foo := ..., належить лише до цього ifпункту, і це в іншому обсязі.


Отже, як загальне правило: якщо ви хочете легко оголосити змінну, яку ви можете використовувати :=, або, якщо ви хочете лише перезаписати існуючу змінну, ви можете використовувати =.

Список літератури:


21

:= є короткою рукою для декларації.

a := 10
b := "gopher"

aбуде оголошено як intі ініціалізовано зі значенням, 10де як bбуде оголошено як рядок та ініціалізовано зі значеннямgopher .

Їх еквіваленти з використанням =будуть

var a = 10
var b = "gopher"

=є оператором присвоєння. Він використовується так само, як і в будь-якій іншій мові.

Ви можете опустити тип при оголошенні змінної та присутні ініціалізатор ( http://tour.golang.org/#11 ).


«= - оператор присвоєння. Він використовується так само, як і в будь-якій іншій мові. » За винятком Ада, де =тільки для порівняння і :=призначено для завдання ...
Alexis Wilke


11

:= заявляє і призначає, = просто призначає

Це корисно, коли ви не хочете заповнювати свій код деклараціями типу або структури.

// Usage with =
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2

// Usage with :=
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)

7

від довідкового документа: ( tour.golang.org )

Усередині функції , то:= оператор короткого призначення може бути використаний замість вару декларації з неявним типом.

Поза межами функції кожна конструкція починається з ключового слова (var, func тощо), і: = конструкція недоступна.



2

Обидва є різною технікою змінного оголошення в мові Go.

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

І

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

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

Детальніше читайте нижче:

Змінні декларації

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


10
Я думаю, що ваш синтаксис неправильний для першого прикладу. Замість: var firstName: = "Джон", це має бути: var firstName = "Джон"
Джино
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.