Golang 中的 err shadowing 問題

今天編譯代碼時遇到了這個問題,記錄一下。

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

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

編譯時會報這樣的錯誤:

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

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

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

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

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

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

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

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

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

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