16.1 誤用短聲明導致變量覆蓋

var remember bool = false
if something {
    remember := true //錯誤
}
// 使用remember

在此代碼段中,remember變量永遠不會在if語句外面變成true,如果somethingtrue,由於使用了短聲明:=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
}

鏈接

results matching ""

    No results matching ""