为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡说叔叔 2021-09-13 15:26:40
在 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 回答

?

TA贡献1818条经验 获得超3个赞

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


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


var usr *user.User 

usr, err = user.Current()

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


查看完整回答
反对 回复 2021-09-13
?

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

}

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


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信