sem novas variáveis ​​no lado esquerdo de: =

104

O que está acontecendo aqui?

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

}

Ele lança um erro que diz

no new variables on left side of :=

O que eu estava fazendo era reatribuir valores a uma variável já declarada.

Runas
fonte
tentativamyArray,x = [...]int{11,12,14},3
Sr. Lou

Respostas:

138

Remova o colon :da segunda instrução ao atribuir um novo valor à variável existente.

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

colon :é usado quando você executa a declaração curta e atribuição pela primeira vez como você está fazendo em sua primeira declaração, isto é myArray :=[...]int{12,14,26}.

Yogendra Singh
fonte
26

Existem dois tipos de operadores de atribuição em go :=e =. Eles são semanticamente equivalentes (com relação à atribuição), mas o primeiro também é uma "declaração de variável curta" ( http://golang.org/ref/spec#Short_variable_declarations ) o que significa que à esquerda precisamos ter pelo menos um nova declaração de variável para que seja correta.

Você pode alterar a segunda para uma instrução de atribuição simples :=-> =ou pode usar uma nova variável se estiver de acordo com o seu algoritmo.

Mihai Toader
fonte
E :=não pode ser usado com _? por exemplo_ := someFunc()
stt106 de
7

Como uma observação lateral, a redeclaração só pode aparecer em uma declaração curta multivariável

Citando a partir da especificação do idioma:

Ao contrário das declarações de variáveis ​​regulares, uma declaração de variável curta pode redeclarar variáveis, desde que tenham sido declaradas originalmente no mesmo bloco com o mesmo tipo, e pelo menos uma das variáveis ​​não em branco seja nova. Como consequência, a redeclaração só pode aparecer em uma declaração curta multivariável. A redeclaração não introduz uma nova variável; apenas atribui um novo valor ao original.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Aqui está um bom exemplo sobre redeclaração de variáveis ​​em golang: https://stackoverflow.com/a/27919847/4418897

Santosh Pillai
fonte
Obrigado pela nota. Eu confundi com uma declaração curta multivariável, isso explica o porquê.
Li Jinyao
7
myArray  :=[...]int{12,14,26}

Conforme afirmado pelos comentadores anteriores, :=é um tipo de declaração abreviada e / ou forma abreviada de variável .

Portanto, na declaração acima, você está fazendo duas coisas.

  1. Você está declarando sua variável como myArray .
  2. Você está atribuindo uma matriz de inteiros à variável myArray .

A segunda parte do seu código falha, porque o que você está fazendo aqui:

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

Está declarando RE-declarando a variável existente myArray, que já contém valores inteiros.

Isso funciona:

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

Porque, ele está atribuindo a matriz inteira à variável existente (pré-declarada / inicializada).

RobEdouard
fonte