no hay nuevas variables en el lado izquierdo de: =

104

¿Que esta pasando 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) ;

}

Lanza un error que dice

no new variables on left side of :=

Lo que estaba haciendo era reasignar valores a una variable ya declarada.

Runas
fuente
pruebamyArray,x = [...]int{11,12,14},3
Mr Lou

Respuestas:

138

Elimine colon :de la segunda instrucción ya que está asignando un nuevo valor a la variable existente.

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

colon :se usa cuando realiza la declaración corta y la asignación por primera vez como lo está haciendo en su primera declaración, es decir myArray :=[...]int{12,14,26}.

Yogendra Singh
fuente
26

Hay dos tipos de operadores de asignación en go :=y =. Son semánticamente equivalentes (con respecto a la asignación) pero la primera es también una "declaración de variable corta" ( http://golang.org/ref/spec#Short_variable_declarations ) lo que significa que en la izquierda necesitamos tener al menos una nueva declaración de variable para que sea correcta.

Puede cambiar el segundo a una declaración de asignación simple :=-> =o puede usar una nueva variable si está bien con su algoritmo.

Mihai Toader
fuente
¿Y :=no se puede usar con _? p_ := someFunc()
stt106
7

Como nota al margen, redeclaración solo puede aparecer en una declaración corta multivariable

Citando de la especificación de idioma:

A diferencia de las declaraciones de variables regulares, una declaración de variable corta puede volver a declarar variables siempre que se hayan declarado anteriormente en el mismo bloque con el mismo tipo y al menos una de las variables que no están en blanco sea nueva. Como consecuencia, la redeclaración solo puede aparecer en una declaración corta multivariable. La redeclaración no introduce una nueva variable; simplemente asigna un nuevo valor al original.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Aquí hay un muy buen ejemplo sobre la redeclaración de variables en golang: https://stackoverflow.com/a/27919847/4418897

Santosh Pillai
fuente
Gracias por la nota. Me he confundido con una declaración corta de múltiples variables, esto explica por qué.
Li Jinyao
7
myArray  :=[...]int{12,14,26}

Como lo indicaron los comentaristas anteriores, :=es un tipo de declaración de variable abreviada y / o abreviada .

Entonces, en la declaración anterior, estás haciendo dos cosas.

  1. Está declarando que su variable es myArray .
  2. Estás asignando una matriz de enteros a la variable myArray .

La segunda parte de su código falla, porque lo que está haciendo aquí:

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

Está declarando de nuevo la variable myArray existente , que ya contiene valores enteros.

Esto funciona:

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

Porque está asignando la matriz de enteros a la variable existente (pre-declarada / inicializada).

RobEdouard
fuente