一尘不染

未定义的err变量

go

作为Go“ newb”,我 不确定 在编译程序时为什么会在控制台中收到 未定义err未定义用户 的错误。

我有:

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)

我意识到我可以在条件块之前声明errand user变量,但是我想知道为什么这不起作用。与一次性创建两个新变量有关吗?

UDPATE 对此有些混乱。

我现在有:

user := core.User{}
if req.Id == nil {
    user, err := signup(C, c, &req)
} else {
    user, err := update(C, c, &req)
}

cleanUser(&user)

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


阅读 205

收藏
2020-07-02

共1个答案

一尘不染

这是因为err您正在创建的变量的作用域:它仅在作用域内(因此有效/可引用),直到您声明该变量的最里面的块的末尾为止。

规格:声明和范围

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

当您在if语句之前声明它时,它将一直作用到容器块的末尾,该容器块还包括第二个if要测试err变量的位置,这样就可以了。

UDPATE:

更新到更新:您使用了Short变量声明来创建新变量,因为您在新块中使用了它。您没有使用这些新变量(仅在user内部块外部声明了“
other” ),因此发生了编译时错误“ user defined and not used”

解决方案很简单:只需在之前声明两个变量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)
}

或者使用一行来声明usererr

user, err := core.User{}, error(nil)
2020-07-02