nessuna nuova variabile sul lato sinistro di: =


104

Cosa sta succedendo qui?

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) ;

}

Genera un errore che dice

no new variables on left side of :=

Quello che stavo facendo era riassegnare i valori a una variabile già dichiarata.


provaremyArray,x = [...]int{11,12,14},3
Mr Lou,

Risposte:


138

Rimuovere il colon :dalla seconda istruzione mentre si assegna un nuovo valore alla variabile esistente.

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

colon :viene utilizzato quando esegui la dichiarazione breve e l'assegnazione per la prima volta come stai facendo nella tua prima istruzione, ad es myArray :=[...]int{12,14,26}.


26

Esistono due tipi di operatori di assegnazione in go :=e =. Sono semanticamente equivalenti (rispetto all'assegnazione) ma la prima è anche una "dichiarazione di variabile breve" ( http://golang.org/ref/spec#Short_variable_declarations ) il che significa che a sinistra dobbiamo avere almeno una nuova dichiarazione di variabile affinché sia ​​corretta.

Puoi cambiare il secondo in una semplice istruzione di assegnazione :=-> =oppure puoi usare una nuova variabile se va bene con il tuo algoritmo.


E :=non può essere utilizzato con _? ad es_ := someFunc()
stt106

7

Come nota a margine , la ridichiarazione può apparire solo in una dichiarazione breve multivariabile

Citando dalla specifica della lingua:

A differenza delle normali dichiarazioni di variabili, una dichiarazione di variabile breve può dichiarare nuovamente le variabili a condizione che siano state originariamente dichiarate in precedenza nello stesso blocco con lo stesso tipo e che almeno una delle variabili non vuote sia nuova. Di conseguenza, la ridichiarazione può apparire solo in una dichiarazione breve multivariabile. La ridichiarazione non introduce una nuova variabile; assegna solo un nuovo valore all'originale.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Ecco un ottimo esempio sulla ridichiarazione delle variabili in golang: https://stackoverflow.com/a/27919847/4418897


Grazie per la nota. Ho confuso una breve dichiarazione multi-variabile, questo spiega perché.
Li Jinyao

7
myArray  :=[...]int{12,14,26}

Come indicato dai commentatori precedenti, :=è un tipo di breve mano e / o la forma abbreviata di variabile dichiarazione .

Quindi nella dichiarazione sopra stai facendo due cose.

  1. Stai dichiarando che la tua variabile è myArray .
  2. Stai assegnando un array di numeri interi alla variabile myArray .

La seconda parte del tuo codice fallisce, perché quello che stai facendo qui:

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

RE-dichiara la variabile esistente myArray, che contiene già valori interi.

Funziona:

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

Perché sta assegnando l'array intero alla variabile esistente (pre-dichiarata / inizializzata).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.