今天編譯代碼時(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
}