aucune nouvelle variable sur le côté gauche de: =

104

Qu'est-ce qu'il se passe ici?

package main

import "fmt"

func main() {

    myArray  :=[...]int{12,14,26}  ;     
    fmt.Println(myArray)

    myArray  :=[...]int{11,12,14} //error pointing on this line 

    fmt.Println(myArray) ;

}

Il jette une erreur qui dit

no new variables on left side of :=

Ce que je faisais était de réaffecter des valeurs à une variable déjà déclarée.

Runes
la source
essayermyArray,x = [...]int{11,12,14},3
Mr Lou

Réponses:

138

Supprimez le colon :de la deuxième instruction lorsque vous affectez une nouvelle valeur à une variable existante.

myArray = [...]int{11,12,14}

colon :est utilisé lorsque vous effectuez la déclaration courte et la cession pour la première fois comme vous le faites dans votre première déclaration, c'est-à-dire myArray :=[...]int{12,14,26}.

Yogendra Singh
la source
26

Il existe deux types d'opérateurs d'affectation dans go :=et =. Ils sont sémantiquement équivalents (en ce qui concerne l'affectation) mais le premier est aussi une "déclaration de variable courte" ( http://golang.org/ref/spec#Short_variable_declarations ) ce qui signifie que dans la gauche, nous devons avoir au moins un nouvelle déclaration de variable pour qu'elle soit correcte.

Vous pouvez changer la seconde en une simple instruction d'affectation :=-> =ou vous pouvez utiliser une nouvelle variable si cela convient à votre algorithme.

Mihai Toader
la source
Et :=ne peut pas être utilisé avec _? eg_ := someFunc()
stt106
7

En remarque, la redéclaration ne peut apparaître que dans une déclaration courte à plusieurs variables

Citant la spécification de la langue:

Contrairement aux déclarations de variables régulières, une déclaration de variable courte peut redéclarer des variables à condition qu'elles aient été initialement déclarées dans le même bloc avec le même type, et qu'au moins une des variables non vides est nouvelle. Par conséquent, la redéclaration ne peut apparaître que dans une déclaration courte à plusieurs variables. La redéclaration n'introduit pas de nouvelle variable; il attribue simplement une nouvelle valeur à l'original.

package main

import "fmt"


func main() {
    a, b := 1, 2
    c, b := 3, 4

    fmt.Println(a, b, c)
}

Voici un très bon exemple de redéclaration de variables dans golang: https://stackoverflow.com/a/27919847/4418897

Santosh Pillai
la source
Merci pour la note. J'ai confondu par une déclaration courte multi-variable, cela explique pourquoi.
Li Jinyao
7
myArray  :=[...]int{12,14,26}

Comme indiqué par les commentateurs précédents, :=est un type de déclaration abrégée et / ou abrégée de variable .

Donc, dans la déclaration ci-dessus, vous faites deux choses.

  1. Vous déclarez que votre variable est myArray .
  2. Vous affectez un tableau d'entiers à la variable myArray .

La deuxième partie de votre code échoue, car ce que vous faites ici:

myArray  :=[...]int{11,12,14} //error pointing on this line 

Est-ce que RE-déclare la variable existante myArray, qui contient déjà des valeurs entières.

Cela marche:

myArray = [...]int{11,12,14} // NO error will be produced by this line

Parce qu'il attribue le tableau d'entiers à la variable existante (pré-déclarée / initialisée).

RobEdouard
la source