今天編譯代碼時遇到了這個問題,記錄一下。
在一個函數(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
}