Différence entre: = et = opérateurs dans Go


283

Quelle est la différence entre les =et les :=opérateurs, et quels sont les cas d'utilisation pour eux? Ils semblent tous les deux être pour une mission?


2
Voir également ceci : Go Visual Variables Visual Guide . J'ai écrit un article à ce sujet.
Inanc Gumus

1
La sémantique ...
JustDave

Si vous souhaitez utiliser un type spécifique x := uint32(123)fonctionne par exemple. Cela doit être évident pour la plupart des gens mais j'ai dû réfléchir quelques minutes ;-)
Kenji Noguchi

Réponses:


198

Seul =l'opérateur d'affectation.

:=fait partie de la syntaxe de la clause de déclaration de variable courte .

👉 Il y a cependant quelques règles. Voir cette autre réponse pour plus de détails.


cela signifie-t-il donc variable avec type inféré? droite?
Krupal Shah

@KrupalShah le lien vers les documents dit littéralement que - "C'est un raccourci pour une déclaration de variable régulière avec des expressions d'initialisation mais pas de types:" golang.org/ref/spec#Short_variable_declarations
akshaynagpal

1
On dirait que :=c'est répertorié comme opérateur ici golang.org/ref/spec#Operators_and_punctuation , donc je ne suis pas sûr d'être d'accord pour dire que " :=n'est en fait pas un opérateur"
Powers

347

Dans Go, :=est pour la déclaration + affectation, tandis que =pour l'affectation uniquement.

Par exemple, var foo int = 10 est identique à foo := 10.


4
Existe-t-il un cas d'utilisation par =opposition à :=? Devriez-vous toujours utiliser :=?
Kenny Worden

3
@KennethWorden Go ne vous permet pas d'utiliser :=pour affecter à une variable qui a déjà été déclarée, sauf si vous attribuez à plusieurs variables à la fois, et qu'au moins une de ces variables est nouvelle.
Kenny Bania

5
le intn'est pas requis, var foo = 10est le même quefoo := 10
Gary Lyn

@KennyWorden, oui. Vous ne pouvez pas utiliser: = en dehors d'une fonction.
Karuhanga

106

Comme d'autres l'ont déjà expliqué, :=c'est à la fois pour la déclaration, la cession et aussi pour la redéclaration; et il devine ( infère ) le type de la variable automatiquement.

Par exemple, foo := 32est une forme abrégée de:

var foo int
foo = 32

// OR:
var foo int = 32

// OR:
var foo = 32

/ * Il y a quelques règles: * /

★ 1ère règle:

Vous ne pouvez pas utiliser :=hors de funcs. C'est parce que, de toute fonction, une déclaration doit commencer par un mot-clé.

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

★ 2e règle:

Vous ne pouvez pas les utiliser deux fois ( dans la même portée ):

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

Parce que, :=introduit "une nouvelle variable" , donc l'utiliser deux fois ne redéclarera pas une deuxième variable, donc c'est illégal.


★ 3e règle:

Vous pouvez les utiliser pour des déclarations et des affectations à variables multiples:

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

★ 4ème règle (redéclaration):

Vous pouvez les utiliser deux fois dans des déclarations "multi-variables" , si l'une des variables est nouvelle :

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

C'est légal, car vous ne déclarez pas toutes les variables, vous réaffectez simplement de nouvelles valeurs aux variables existantes et déclarez de nouvelles variables en même temps. C'est ce qu'on appelle la redéclaration .


★ 5ème règle:

Vous pouvez utiliser la déclaration courte pour déclarer une variable dans une portée plus récente même si cette variable est déjà déclarée avec le même nom avant:

var foo int = 34

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

Ici, foo := 42c'est légal, car, il déclare foodans some()la portée de func. foo = 314est légal, car il attribue simplement une nouvelle valeur à foo.


★ 6e règle:

Vous pouvez déclarer le même nom dans des blocs d'instructions courts comme: if , for , switch :

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

Parce que, foodans if foo := ..., n'appartient qu'à cette ifclause et est dans une portée différente.


Donc, en règle générale: si vous voulez déclarer facilement une variable que vous pouvez utiliser :=, ou, si vous voulez seulement écraser une variable existante, vous pouvez utiliser =.

Références:


21

:= est un raccourci pour la déclaration.

a := 10
b := "gopher"

asera déclaré comme intet initialisé avec une valeur 10où as bsera déclaré comme une chaîne et initialisé avec une valeur gopher.

Leurs équivalents utilisant =seraient

var a = 10
var b = "gopher"

=est opérateur d'affectation. Il est utilisé de la même manière que vous l'utiliseriez dans n'importe quelle autre langue.

Vous pouvez omettre le type lorsque vous déclarez la variable et qu'un initialiseur est présent ( http://tour.golang.org/#11 ).


«= Est l'opérateur d'affectation. Il est utilisé de la même manière que vous l'utiliseriez dans n'importe quelle autre langue. » Sauf à Ada où =c'est uniquement pour comparaison et :=pour affectation ...
Alexis Wilke

13

Le: = signifie déclarer et assigner tandis que le = signifie simplement assigner.


11

:=déclare et attribue, =attribue simplement

C'est utile lorsque vous ne voulez pas remplir votre code avec des déclarations de type ou de structure.

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

du document de référence: ( tour.golang.org )

À l'intérieur d'une fonction , la :=courte instruction d'affectation peut être utilisée à la place d'une déclaration var de type implicite.

En dehors d'une fonction , chaque construction commence par un mot clé (var, func, etc.) et la construction: = n'est pas disponible.



2

Les deux sont les différentes techniques de déclaration de variables en langage Go.

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

ET

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

Une déclaration de variable courte est un raccourci pour une déclaration de variable régulière avec des expressions d'initialisation mais pas de types.

Lisez ci-dessous pour plus de détails:

Déclarations variables

Déclarations de variables courtes


10
Je pense que votre syntaxe est incorrecte pour le premier exemple. Au lieu de: var firstName: = "John", cela devrait être: var firstName = "John"
Gino
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.