作为 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)
- 1 回答
- 0 关注
- 217 浏览
添加回答
举报
0/150
提交
取消