нет новых переменных слева от: =

104

Что тут происходит?

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

}

Выдает ошибку, в которой говорится

no new variables on left side of :=

То, что я делал, - это переназначение значений уже объявленной переменной.

Руны
источник
попробуйтеmyArray,x = [...]int{11,12,14},3
Мистер Лу

Ответы:

138

Удалите colon :из второго оператора, поскольку вы присваиваете новое значение существующей переменной.

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

colon :используется при выполнении короткой декларации и назначение в первый раз , как вы делаете в своем первом , т.е. заявление myArray :=[...]int{12,14,26}.

Йогендра Сингх
источник
26

В go :=и есть два типа операторов присваивания =. Они семантически эквивалентны (в отношении присваивания), но первый также является «кратким объявлением переменной» ( http://golang.org/ref/spec#Short_variable_declarations ), что означает, что слева нам нужно иметь как минимум новое объявление переменной, чтобы оно было правильным.

Вы можете изменить вторую на простой оператор присваивания :=-> =или использовать новую переменную, если это подходит вашему алгоритму.

Михай Тоадер
источник
И :=нельзя использовать с _? eg_ := someFunc()
stt106
7

В качестве примечания, повторное объявление может появиться только в кратком объявлении с несколькими переменными.

Цитата из спецификации языка:

В отличие от обычных объявлений переменных, краткое объявление переменных может повторно объявлять переменные при условии, что они были изначально объявлены ранее в том же блоке с тем же типом, и по крайней мере одна из непустых переменных является новой. Как следствие, повторное объявление может появиться только в кратком объявлении с несколькими переменными. Повторное объявление не вводит новую переменную; он просто присваивает новое значение оригиналу.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Вот очень хороший пример повторного объявления переменных в голанге: https://stackoverflow.com/a/27919847/4418897

Сантош Пиллаи
источник
Спасибо за замечание. Меня смутило краткое объявление с несколькими переменными, это объясняет, почему.
Ли Цзиньяо
7
myArray  :=[...]int{12,14,26}

Как указывалось предыдущими комментаторами, :=это вид сокращенного и / или сокращенного объявления переменной .

Итак, в приведенном выше статусе вы делаете две вещи.

  1. Вы объявляете свою переменную myArray .
  2. Вы назначаете массив целых чисел переменной myArray .

Вторая часть вашего кода не работает, потому что то, что вы здесь делаете:

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

Повторно объявляет существующую переменную myArray, которая уже содержит целочисленные значения.

Это работает:

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

Потому что он присваивает целочисленный массив существующей (предварительно объявленной / инициализированной) переменной.

РобЭдуард
источник