16.1 誤用短聲明導致變量覆蓋
var remember bool = false
if something {
remember := true //錯誤
}
// 使用remember
在此代碼段中,remember
變量永遠不會在if
語句外面變成true
,如果something
爲true
,由於使用了短聲明:=
,if
語句內部的新變量remember
將覆蓋外面的remember
變量,並且該變量的值爲true
,但是在if
語句外面,變量remember
的值變成了false
,所以正確的寫法應該是:
if something {
remember = true
}
此類錯誤也容易在for
循環中出現,尤其當函數返回一個具名變量時難於察覺
,例如以下的代碼段:
func shadow() (err error) {
x, err := check1() // x是新創建變量,err是被賦值
if err != nil {
return // 正確返回err
}
if y, err := check2(x); err != nil { // y和if語句中err被創建
return // if語句中的err覆蓋外面的err,所以錯誤的返回nil!
} else {
fmt.Println(y)
}
return
}