Golang中,:=
同時進行了變量聲明和賦值。
當:=
左邊有多個變量時,編譯器只檢查左邊至少有一個新變量。
如果其中有的變量已經(jīng)聲明,則只做賦值操作。
比如:
_ := 1 // error. Nothing New declared
a, _ := foo() // ok. Declare a
a, b := foo() // ok. Declare b, assign a
_, b := foo() // error. Nothing New declared
設想下面這種狀況:
func main() {
var err error
if true {
data, err := strconv.Atoi("x")
if err == nil {
fmt.Println("Atoi success:", data)
}
}
fmt.Print(err)
}
第二次打印出來的實際是<nil>
。
這是因為在if的語法塊中,err被重新聲明了。外層的err沒有經(jīng)過賦值,也就是nil。
可以修改如下:
func main() {
var err error
if true {
var data int
data, err = strconv.Atoi("x")
if err == nil {
fmt.Println("Atoi success:", data)
}
}
fmt.Print(err)
}
在子詞法域中,對外層聲明的變量賦值時,應保證使用=
而非:=
。