Diferença entre: = e = operadores no Go


283

Qual é a diferença entre o =e :=operadores, e quais são os casos de uso para eles? Ambos parecem ser para uma tarefa?


2
Veja também : Guia visual das variáveis ​​Go . Eu escrevi um artigo sobre isso.
Inanc Gumus

1
A semântica ...
JustDave 27/01

Se você deseja usar um tipo específico, x := uint32(123)funciona por exemplo. Deve ser óbvio para a maioria das pessoas, mas eu tinha que pensar alguns minutos ;-)
Kenji Noguchi

Respostas:


198

Somente =é o operador de atribuição.

:=faz parte da sintaxe da cláusula Short variable declarações .

Though Existem algumas regras. Veja esta outra resposta para mais detalhes.


então significa variável com tipo inferido? certo?
Krupal Shah

@KrupalShah o link para a documentação diz literalmente que - "É uma abreviação de uma declaração de variável regular com expressões inicializadoras, mas sem tipos:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
Parece que :=está listado como operador aqui golang.org/ref/spec#Operators_and_punctuation , então não tenho certeza se concordo que " :=na verdade não é um operador"
Poderes

347

No Go, :=é para declaração + atribuição, enquanto que =é apenas para atribuição.

Por exemplo, var foo int = 10 é o mesmo que foo := 10.


4
Existe um caso de uso para, =por oposição a :=? Você deve sempre usar sempre :=?
precisa

3
O @KennethWorden Go não permitirá que você use :=para atribuir a uma variável que já foi declarada, a menos que você esteja atribuindo a várias variáveis ​​ao mesmo tempo e pelo menos uma dessas variáveis ​​seja nova.
Kenny Bania

5
o intnão é necessário, var foo = 10é o mesmo quefoo := 10
Gary Lyn

@KennyWorden, sim. Você não pode usar: = fora de uma função.
Karuhanga

105

Como outros já explicaram, :=é para declaração, atribuição e também para redeclaração; e adivinha ( infere ) o tipo da variável automaticamente.

Por exemplo, foo := 32é uma forma abreviada de:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Existem algumas regras: * /

★ 1ª regra:

Você não pode usar :=fora de funcs. É porque, de qualquer função, uma instrução deve começar com uma palavra-chave.

// 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ª regra:

Você não pode usá-los duas vezes ( no mesmo escopo ):

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

Porque, :=introduz "uma nova variável" , portanto, usá-la duas vezes não redeclarar uma segunda variável, sendo ilegal.


★ 3ª regra:

Você pode usá-los para declarações e atribuições de várias variáveis:

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

★ 4ª regra (redeclaração):

Você pode usá-los duas vezes nas declarações "multi-variable" , se uma das variáveis ​​for nova :

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

Isso é legal, porque, você não está declarando todas as variáveis, está apenas reatribuindo novos valores às variáveis ​​existentes e declarando novas variáveis ​​ao mesmo tempo. Isso é chamado de redeclaração .


★ 5ª regra:

Você pode usar a declaração curta para declarar uma variável em um escopo mais recente, mesmo que a variável já esteja declarada com o mesmo nome antes:

var foo int = 34

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

Aqui, foo := 42é legal, porque declara foono some()escopo de func. foo = 314é legal porque apenas atribui um novo valor a foo.


★ 6ª regra:

Você pode declarar o mesmo nome em blocos curtos de instruções como: if , for , switch :

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

Porque, fooem if foo := ..., pertence apenas a essa ifcláusula e está em um escopo diferente.


Portanto, como regra geral: se você deseja declarar facilmente uma variável, pode usar :=ou, se deseja substituir apenas uma variável existente, pode usar =.

Referências:


21

:= é uma abreviação para declaração.

a := 10
b := "gopher"

aserá declarado como um inte inicializado com valor, em 10que como bserá declarado como uma sequência e inicializado com valor gopher.

Seus equivalentes usando =seriam

var a = 10
var b = "gopher"

=é um operador de atribuição. É usado da mesma maneira que você usaria em qualquer outro idioma.

Você pode omitir o tipo quando declarar a variável e um inicializador estiver presente ( http://tour.golang.org/#11 ).


«= É operador de atribuição. É usado da mesma maneira que em qualquer outro idioma. Exceto em Ada, onde =é apenas para comparação e :=é para atribuição ...
Alexis Wilke

13

O: = significa declarar e atribuir enquanto o = significa simplesmente atribuir.


11

:=declara e atribui, =apenas atribui

É útil quando você não deseja preencher seu código com declarações de tipo ou estrutura.

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

do documento de referência: ( tour.golang.org )

Dentro de uma função , a :=instrução de atribuição curta pode ser usada no lugar de uma declaração var com o tipo implícito.

Fora de uma função , cada construção começa com uma palavra-chave (var, func etc.) e a construção: = não está disponível.



2

Ambas são as diferentes técnicas de declaração de variáveis ​​na linguagem Go.

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

E

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

Uma declaração curta de variável é um atalho para uma declaração regular de variável com expressões inicializadoras, mas sem tipos.

Leia abaixo para obter detalhes:

Declarações variáveis

Declarações curtas de variáveis


10
Eu acho que sua sintaxe está errada para o primeiro exemplo. Em vez de: var firstName: = "John", ele deve ser: var firstName = "John"
Gino
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.