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


283

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


2
Также смотрите это : Go Variables Visual Guide . Я написал статью об этом.
Inanc Gumus

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

Если вы хотите использовать определенный тип x := uint32(123)работает, например. Это должно быть очевидно для большинства людей, но мне пришлось подумать несколько минут ;-)
Кэндзи Ногучи

Ответы:


198

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

:=является частью синтаксиса объявлений переменных Short .

Though Есть несколько правил, хотя. Смотрите этот другой ответ для более подробной информации.


так значит ли это переменная с предполагаемым типом? право?
Крупал Шах

@KrupalShah ссылка на документы в буквальном смысле говорит о том, что: «Это сокращение для объявления обычной переменной с выражениями инициализатора, но без типов:» golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Похоже, что :=здесь указан оператор golang.org/ref/spec#Operators_and_punctuation , поэтому я не уверен, что согласен с тем, что « :=на самом деле не оператор»
Powers

347

В Go :=- для объявления + присваивания, тогда =как только для присваивания.

Например, так var foo int = 10 же, как foo := 10.


4
Есть ли вариант использования для =в отличие от :=? Вы должны просто всегда использовать :=?
Кенни Уорден,

3
@KennethWorden Go не позволит вам :=назначать переменную, которая уже была объявлена, если только вы не присваиваете нескольким переменным одновременно, и хотя бы одна из этих переменных является новой.
Кенни Баня

5
intне требуется, var foo = 10так же , какfoo := 10
Гэри Lyn

@KennyWorden, да. Вы не можете использовать: = вне функции.
Каруханга

106

Как уже объяснили другие, :=предназначен как для объявления, назначения, а также для повторного объявления; и он угадывает ( выводит ) тип переменной автоматически.

Например, 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()func. 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где as bбудет объявлен как строка и инициализирован значением gopher.

Использование их эквивалентов =будет

var a = 10
var b = "gopher"

=является оператором присваивания. Он используется так же, как и на любом другом языке.

Вы можете опустить тип, когда объявляете переменную и присутствует инициализатор ( http://tour.golang.org/#11 ).


«= Является оператором присваивания. Он используется так же, как и на любом другом языке ». За исключением Ады, где =только для сравнения и :=для назначения ...
Алексис Уилк


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: = "John", это должно быть: var firstName = "John"
Gino
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.