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

未定义的错误变量

未定义的错误变量

Go
冉冉说 2021-11-08 15:58:18
作为 Go“新手”,我不确定为什么在编译程序时在控制台中收到错误undefined err和undefined user。我有:if req.Id == nil {    user, err := signup(C, c, &req)} else {    user, err := update(C, c, &req)}if err != nil {    c.JSON(http.StatusOK, err)    return}doSomethingWith(user)我意识到我可以在条件块之前声明erranduser变量,但我想知道为什么这不起作用。这与一次性创建两个新变量有关吗?UDPATE 对此有点混乱。我现在有:user := core.User{}if req.Id == nil {    user, err := signup(C, c, &req)} else {    user, err := update(C, c, &req)}cleanUser(&user)我的错误现在是用户声明的,而不是使用的。我目前没有解决错误部分,但我不确定为什么我会收到关于用户的错误。
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

这是因为err您正在创建的变量的范围:它仅在范围内(因此有效/可引用)直到您声明它的最内层块的末尾。


规范:声明和范围


在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,并在最里面的包含块的末尾结束。


当您在if语句之前声明它时,它将在容器块结束之前一直处于范围内,其中还包括if您测试err变量的第二个位置,所以没关系。


UDPATE:


更新您的更新:您使用了一个Short 变量声明来创建新变量,因为您在新块中使用了它。您尚未使用这些新变量(仅在user内部块外声明的“其他”变量)因此出现编译时错误“用户声明但未使用”。


解决方案很简单:只需在 之前声明两个变量if,不要使用短变量声明,而是简单地赋值:


user := core.User{}

var err error


if req.Id == nil {

    user, err = signup(C, c, &req)

} else {

    user, err = update(C, c, &req)

}


if err == nil {

    cleanUser(&user)

}

或者使用一行来声明user和err:


user, err := core.User{}, error(nil)


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

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