2013-07-26 2 views
130

In Go, в чем разница между оператором = и :=? Оба они кажутся для назначения? Это может быть очевидно, но я не могу найти его в документах.Разница между операторами Golang между: = vs =

+1

** Также см. Это **: [Перейдите на Визуальный указатель переменных] (https://blog.learngoprogramming.com/learn-go-lang-variables-visual-tutorial-and-ebook-9a061d29babe). Я написал статью об этом. –

+0

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

ответ

106

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

:= на самом деле не operator. Он является частью синтаксиса предложения Short variable declarations.

+1

Спасибо всем: D и спасибо jnml за ссылку на документацию – Chris

+0

, так это означает переменную с выведенным типом? правильно? –

6

The: = означает объявление и присваивать while = означает просто назначить.

95

In Go, := для декларации + назначение, тогда как = предназначен только для назначения.

Например, var foo int = 10 - это то же, что и foo := 10.

+0

Вы не подразумеваете 'var foo int = 10'? В Go тип появляется после имени переменной. – amon

+0

@amon right, извините, я не слишком хорошо знаком с синтаксисом go, позвольте мне изменить это – Chaos

+9

Это должен быть ответ. Примеры являются гораздо более полезными, чем просто ссылка на документацию. – rottenoats

9

:= объявляет и правопреемников, = просто присваивает

Это полезно, когда вы не хотите, чтобы заполнить ваш код объявлений типа или структуры.

// 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) 
15

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

a := 10 
b := "gopher" 

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

их эквиваленты с использованием = бы

var a = 10 
var b = "gopher" 

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

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

6

от эталонного дока: (tour.golang.org)

Внутри функций, оператор короткого ДЕЛЕГИРОВАНИЯ := может использоваться вместо вара декларации с неявным типом.

Внешняя функция, каждая конструкция начинается с ключевого слова (var, func и т. Д.), А конструкция: = недоступна.

1

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

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

И

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

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

Читай ниже подробно:

Variable declarations

Short variable declarations

+6

Я думаю, что ваш синтаксис неверен для первого примера. Вместо: var firstName: = "John", это должно быть: var firstName = "John" – Gino

8

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

Это стенография форма:

var foo int 
foo = 32 

// OR: 
var foo int = 32 

// OR: 
var foo = 32 

Некоторые правила

Вы не можете использовать := из funcs.

illegal := 42 

func foo() { 
    legal := 42 
} 

Вы не можете использовать их в два раза:

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

Потому что, := вводит «новую переменную», поэтому использовать его дважды не переобъявить вторую переменную, так что незаконным.


Однако, вы можете использовать их дважды в "мульти-переменной" деклараций, , если одна из переменных являются новыми:

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

Это законно, потому что, вы а не переопределяющие переменные, вы просто переназначаете новые значения существующим переменным с некоторыми новыми переменными.


Вы можете использовать их, если переменная уже объявлена ​​с тем же именем, прежде чем:

var foo int = 34 

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

Здесь foo := 42 является законным, потому что, redeclares foo в рамках some() Func в. foo = 314 является законным, потому что он просто переназначает новое значение foo.

_


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

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

_


Вы можете использовать их в контекстном заявлении контекстов как: если, за, переключатель:

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

Потому что, if foo := ... назначение, доступны только для этого if пункта.


Таким образом, как общее правило: Если вы не повторного объявления переменной можно использовать :=, или, если вы хотите перезаписать существующие значения, вы можете использовать =.

+1

Спасибо за упоминание всех случаев использования. – AnirbanDebnath