猿问

未定义的错误变量

作为 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)

我的错误现在是用户声明的,而不是使用的。我目前没有解决错误部分,但我不确定为什么我会收到关于用户的错误。


冉冉说
浏览 218回答 1
1回答

忽然笑

这是因为err您正在创建的变量的范围:它仅在范围内(因此有效/可引用)直到您声明它的最内层块的末尾。规范:声明和范围在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,并在最里面的包含块的末尾结束。当您在if语句之前声明它时,它将在容器块结束之前一直处于范围内,其中还包括if您测试err变量的第二个位置,所以没关系。UDPATE:更新您的更新:您使用了一个Short 变量声明来创建新变量,因为您在新块中使用了它。您尚未使用这些新变量(仅在user内部块外声明的“其他”变量)因此出现编译时错误“用户声明但未使用”。解决方案很简单:只需在 之前声明两个变量if,不要使用短变量声明,而是简单地赋值:user := core.User{}var err errorif 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)
随时随地看视频慕课网APP

相关分类

Go
我要回答