2 回答

TA貢獻1818條經驗 獲得超3個贊
不,你不能做你想做的事。
你的選擇是不使用命名返回,或者像你說的那樣聲明
var usr *user.User
usr, err = user.Current()
在某些情況下,您可以這樣做,但在您的情況下,您正在創建一個 new ,err因為您在 if 塊中,并且它正在對 new 進行本地范圍的引用err。

TA貢獻1824條經驗 獲得超5個贊
如果您稍微重構代碼并且不將user.Current()調用放在另一個塊中(if在您的情況下),則可以使用:= Short 變量聲明:
func getConfigFilepath(userSuppliedFilepath string) (filepath string, err error) {
if userSuppliedFilepath != "" {
return userSuppliedFilepath, nil
}
usr, err := user.Current()
filepath = path.Join(usr.HomeDir, ".myprogram.config.json")
return
}
編輯:
你可能會說這個代碼比起原來的更長,但請注意,您原來的代碼是沒有有效的,也是不完整的,因為當它不處理的情況下userSuppliedFilepath提供。您應該將建議的代碼與以下代碼的完整有效版本進行比較:
func getConfigFilepath(userSuppliedFilepath string) (filepath string, err error) {
if userSuppliedFilepath == "" {
var usr *user.User
usr, err = user.Current()
filepath = path.Join(usr.HomeDir, ".myprogram.config.json")
} else {
filepath = userSuppliedFilepath
}
return
}
現在提議的代碼不再長(相反,它更短了一點)。
- 2 回答
- 0 關注
- 220 瀏覽
添加回答
舉報