Golang 中的 err shadowing 問(wèn)題

今天編譯代碼時(shí)遇到了這個(gè)問(wèn)題,記錄一下。

在一個(gè)函數(shù)中,給返回的 error 定義了名稱。這個(gè)函數(shù)定義類似下面這樣:

func foo(a string) (err error) {
    res, err := bar(a)
    if err != nil {
        return
    }
    
    // do anything else
    
    return
}

編譯時(shí)會(huì)報(bào)這樣的錯(cuò)誤:

../../../../server/init.go:455:4: err is shadowed during return

這個(gè)問(wèn)題很容易被忽略,返回的錯(cuò)誤意思是函數(shù)在 return 時(shí),err 被覆蓋了,被誰(shuí)覆蓋了?

本來(lái)在調(diào)用 bar 函數(shù)發(fā)生錯(cuò)誤時(shí),應(yīng)該返回的是當(dāng)前發(fā)生的錯(cuò)誤,但由于返回值中定義了錯(cuò)誤名稱,所以返回的是外面函數(shù)返回值中定義的 err,而不是 if err != nil 里這個(gè) err,這樣應(yīng)當(dāng)返回的錯(cuò)誤就被外面那個(gè) err 給覆蓋了。

如果還要用這種定義返回值名稱的方式,可以顯式的返回 if 中的錯(cuò)誤:

func foo(a string) (err error) {
    res, err := bar(a)
    if err != nil {
        return err
    }
    
    // do anything else
    
    return
}

不過(guò)這種寫法還是沒(méi)有在函數(shù)內(nèi)部顯式的聲明變量來(lái)的直觀:

func foo(a string) error {
    res, err := bar(a)
    if err != nil {
        return err
    }
    
    // do anything else
    
    return nil
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,259評(píng)論 0 38
  • 人的緣分真的很奇妙啊。 一次簡(jiǎn)單的對(duì)話、一次簡(jiǎn)單的會(huì)面就成為好朋友,這一切似乎都安排好了。 初秋雨蒙蒙,千里來(lái)踐行...
    見夏知曉閱讀 674評(píng)論 1 0
  • 窗外,淅淅瀝瀝的下著雨 整個(gè)天空都是灰蒙蒙的一片 整個(gè)人也慵懶的躺在床上 總想干點(diǎn)什么 又什么都不想做
    慧峰諾閱讀 122評(píng)論 0 0
  • 習(xí)慣上,北上廣深被稱為一線城市,是程序員就業(yè)的首選。一些直轄市、區(qū)域中心城市、東部經(jīng)濟(jì)發(fā)達(dá)地區(qū)的省會(huì)城市和沿海開放...
    花瓣瞳孔小姐閱讀 1,214評(píng)論 1 9

友情鏈接更多精彩內(nèi)容