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 := 32
est 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 := 42
c'est légal, car, il déclare foo
dans some()
la portée de func. foo = 314
est 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, foo
dans if foo := ...
, n'appartient qu'à cette if
clause 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: