在Go中,如果为返回变量命名,则在函数开始时将它们初始化为零值。我在下面使用此功能,在err
行上使用usr, err = user.Current()
变量。是否可以对usr
变量使用类型推断而不是err
变量?我真的不想宣布var usr *user.user
我宁愿在这里使用类型推断。
func getConfigFilepath(userSuppliedFilepath string) (filepath string, err error) {
if userSuppliedFilepath == "" {
usr, err = user.Current()
filepath = path.Join(usr.HomeDir, ".myprogram.config.json")
}
return
}
答案 0 :(得分:4)
不,你不能做你想做的事。
您的选择是不使用命名返回,或者像您说的声明
var usr *user.User
usr, err = user.Current()
在某些情况下,您可以这样做,但在您的情况下,您正在创建一个新的err
,因为您位于if块中,并且它正在对新err
进行本地范围的引用。
答案 1 :(得分:1)
如果您稍微重新构建代码并且未将user.Current()
调用放在另一个块(if
中),则可以使用{{1> }} Short variable declaration:
:=
修改强>
您可能会说此代码比原始代码长,但请注意您的原始代码尚未生效且不完整因为它不处理此情况提供了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
现在提议的代码不再长(相反,它的时间会更短)。