【问题标题】:Go type inference and named return variablesGo 类型推断和命名返回变量
【发布时间】:2015-02-04 06:16:58
【问题描述】:

在 Go 中,如果您为返回变量命名,则它们会在函数开始时初始化为零值。我在下面使用此功能和usr, err = user.Current() 行上的err 变量。是否可以对 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
}

【问题讨论】:

    标签: go


    【解决方案1】:

    不,你不能做你想做的事。

    你的选择是不使用命名返回,或者像你说的那样声明

    var usr *user.User 
    usr, err = user.Current()
    

    在某些情况下您可以这样做,但在您的情况下,您正在创建一个新的err,因为您在 if 块中,并且它正在对新的 err 进行本地范围的引用。

    【讨论】:

    • 嗯,好的。我就是这么想的。
    • 为什么不直接使用:=
    【解决方案2】:

    如果你稍微重构你的代码并且你没有将user.Current()调用放在另一个块中(在你的情况下是if),那么你可以使用:=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。您应该将建议的代码与以下代码的完整有效版本进行比较:

    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
    }
    

    现在提议的代码不再长了(相反,它短了一点)。

    【讨论】:

    • 哦,是的,如果我在顶级范围内,我可以使用类型推断。但是我认为当我现在阅读该函数时,它并没有那么清晰,而且代码行数更多。 play.golang.org/p/0LY2V1fhjP
    • @Neil 请查看我编辑的答案。您正在将建议的代码与您的代码的无效和不完整版本进行比较。完成您的并修改您建议的代码编辑会改变图片。但是哪个更易读并不是一个客观的问题。但是您最初的问题是您是否可以使用此代码解决类型推断:此代码不包括类型*user.User
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多