brak nowych zmiennych po lewej stronie: =

104

Co tu się dzieje?

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

}

Wyświetla błąd, który mówi

no new variables on left side of :=

To, co robiłem, to ponowne przypisywanie wartości do już zadeklarowanej zmiennej.

Runy
źródło
spróbujmyArray,x = [...]int{11,12,14},3
Pan Lou

Odpowiedzi:

138

Usuń colon :z drugiej instrukcji, gdy przypisujesz nową wartość do istniejącej zmiennej.

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

colon :jest używany, gdy wykonujesz krótką deklarację i przypisanie po raz pierwszy, tak jak robisz to w pierwszej instrukcji, tj myArray :=[...]int{12,14,26}.

Yogendra Singh
źródło
26

Istnieją dwa typy operatorów przypisania w go :=i =. Są semantycznie równoważne (w odniesieniu do przypisania), ale pierwsza z nich to także „krótka deklaracja zmiennej” ( http://golang.org/ref/spec#Short_variable_declarations ), co oznacza, że ​​po lewej stronie musimy mieć co najmniej nowa deklaracja zmiennej, aby była poprawna.

Możesz zmienić drugą na prostą instrukcję przypisania :=-> =lub możesz użyć nowej zmiennej, jeśli jest to w porządku z twoim algorytmem.

Mihai Toader
źródło
I :=nie można go używać z _? np._ := someFunc()
stt106
7

Na marginesie, ponowna deklaracja może pojawić się tylko w krótkiej deklaracji zawierającej wiele zmiennych

Cytat ze specyfikacji języka:

W przeciwieństwie do zwykłych deklaracji zmiennych, krótka deklaracja zmiennej może ponownie zadeklarować zmienne, pod warunkiem, że zostały pierwotnie zadeklarowane wcześniej w tym samym bloku tego samego typu i co najmniej jedna z niepustych zmiennych jest nowa. W konsekwencji ponowna deklaracja może pojawić się tylko w krótkiej deklaracji zawierającej wiele zmiennych. Ponowna deklaracja nie wprowadza nowej zmiennej; po prostu przypisuje nową wartość do oryginału.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Oto bardzo dobry przykład dotyczący ponownej deklaracji zmiennych w golang: https://stackoverflow.com/a/27919847/4418897

Santosh Pillai
źródło
Dzięki za wiadomość. Zmyliłem się krótką deklaracją wielu zmiennych, to wyjaśnia dlaczego.
Li Jinyao
7
myArray  :=[...]int{12,14,26}

Jak stwierdzili poprzedni komentatorzy, :=jest to rodzaj short-hand i / lub short-form deklaracji zmiennej .

Zatem w powyższym zdaniu robisz dwie rzeczy.

  1. Jesteś deklarując zmienną być myArray .
  2. Jesteś przypisując tablicę liczb całkowitych do MyArray zmiennej.

Druga część twojego kodu zawodzi, ponieważ to, co tutaj robisz:

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

Czy RE deklaruje istniejącą zmienną myArray, która już zawiera wartości całkowite.

To działa:

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

Ponieważ przypisuje tablicę liczb całkowitych do istniejącej (wstępnie zadeklarowanej / zainicjowanej) zmiennej.

RobEdouard
źródło