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

}


胡说叔叔
浏览 198回答 2
2回答

泛舟湖上清波郎朗

不,你不能做你想做的事。你的选择是不使用命名返回,或者像你说的那样声明var usr *user.User usr, err = user.Current()在某些情况下,您可以这样做,但在您的情况下,您正在创建一个 new ,err因为您在 if 块中,并且它正在对 new 进行本地范围的引用err。

沧海一幻觉

如果您稍微重构代码并且不将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}现在提议的代码不再长(相反,它更短了一点)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go