không có biến mới nào ở bên trái của: =


104

Điều gì đang xảy ra ở đây?

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

}

Nó ném ra một lỗi cho biết

no new variables on left side of :=

Những gì tôi đang làm là gán lại các giá trị cho một biến đã được khai báo.


cố gắngmyArray,x = [...]int{11,12,14},3
Mr Lou

Câu trả lời:


138

Xóa colon :khỏi câu lệnh thứ hai khi bạn đang gán một giá trị mới cho biến hiện có.

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

colon :được sử dụng khi bạn thực hiện khai báo và gán ngắn lần đầu tiên như khi bạn thực hiện trong câu lệnh đầu tiên của mình, tức là myArray :=[...]int{12,14,26}.


26

Có hai loại toán tử gán trong go :==. Chúng tương đương nhau về mặt ngữ nghĩa (đối với phép gán) nhưng cái đầu tiên cũng là "khai báo biến ngắn" ( http://golang.org/ref/spec#Short_variable_decl Tuyên bố ) có nghĩa là ở bên trái chúng ta cần có ít nhất một khai báo biến mới cho nó là đúng.

Bạn có thể thay đổi câu lệnh thứ hai thành một câu lệnh gán đơn giản :=-> =hoặc bạn có thể sử dụng một biến mới nếu điều đó phù hợp với thuật toán của bạn.


:=không thể được sử dụng với _? vd_ := someFunc()
stt106 10/03 '19

7

Lưu ý thêm, khai báo lại chỉ có thể xuất hiện trong khai báo ngắn có nhiều biến

Trích dẫn từ đặc tả ngôn ngữ:

Không giống như khai báo biến thông thường, khai báo biến ngắn có thể khai báo lại các biến miễn là chúng đã được khai báo ban đầu trước đó trong cùng một khối với cùng kiểu và ít nhất một trong các biến không trống là mới. Do đó, khai báo lại chỉ có thể xuất hiện trong một khai báo ngắn có nhiều biến. Khai báo lại không giới thiệu một biến mới; nó chỉ gán một giá trị mới cho giá trị ban đầu.

package main

import "fmt"


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

    fmt.Println(a, b, c)
}

Đây là một ví dụ rất hay về khai báo lại các biến trong golang: https://stackoverflow.com/a/27919847/4418897


Cảm ơn vì đã lưu ý. Tôi đã bối rối bởi một khai báo ngắn nhiều biến, điều này giải thích tại sao.
Li Jinyao

7
myArray  :=[...]int{12,14,26}

Như đã nêu bởi những người bình luận trước đây, :=là một kiểu khai báo biến ngắn gọn và / hoặc rút gọn .

Vì vậy, trong trạng thái trên bạn đang làm hai điều.

  1. Bạn đang khai báo biến của mình là myArray .
  2. Bạn đang gán một mảng số nguyên cho biến myArray .

Phần thứ hai của mã của bạn không thành công, vì những gì bạn đang làm ở đây:

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

Khai báo lại biến myArray hiện có , đã chứa các giá trị nguyên.

Những công việc này:

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

Bởi vì, nó đang gán mảng số nguyên cho biến hiện có (khai báo trước / khởi tạo).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.