немає нових змінних зліва від: =


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 ), що означає, що зліва нам потрібно мати принаймні нове оголошення змінної, щоб воно було правильним.

Ви можете змінити другий на простий оператор призначення :=-> =або скористатися новою змінною, якщо це нормально з вашим алгоритмом.


І :=не можна використовувати _? наприклад_ := someFunc()
stt106

7

Як бічна примітка, передекларація може відображатися лише у багатозмінній короткій заяві

Цитування з мовної специфікації:

На відміну від звичайних оголошень змінних, коротке оголошення змінної може передекларувати змінні, за умови, що вони були спочатку оголошені раніше в одному блоці з тим же типом, і принаймні одна з порожніх змінних є новою. Як наслідок, передекларація може відображатися лише у багатозмінній короткій заяві. Повторна декларація не вводить нову змінну; він просто присвоює нове значення оригіналу.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Ось дуже хороший приклад щодо передекларації змінних у golang: 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 

RE-декларує існуючу змінну myArray, яка вже містить цілі значення.

Це працює:

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

Тому що він призначає цілий масив існуючій (попередньо оголошеній / ініціалізованій) змінній.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.