转类型推断和命名返回变量

时间:2015-02-04 06:16:59

标签: go

在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
}

2 个答案:

答案 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

现在提议的代码不再长(相反,它的时间会更短)。