未定义的错误变量

时间:2015-09-17 10:52:02

标签: go

作为Go“newb”,我不确定为什么我在编译程序时在控制台中收到错误 undefined 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)

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

UDPATE 搞得一团糟。

我现在有了:

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

cleanUser(&user)

现在我的错误是用户已声明且未使用。我目前不是在处理错误部分,但我不确定为什么我会收到有关用户的错误。

1 个答案:

答案 0 :(得分:10)

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

规格:Declarations and scope

  

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

当你在if语句之前声明它时,它将在范围内,直到容器块的末尾,其中还包括你测试if变量的第二个err,所以没关系。

<强> UDPATE:

更新到您的更新:您使用Short variable declaration创建新变量,因为您在新块中使用了它。您还没有使用这些新变量(只有&#34;其他&#34; user在内部块之外声明)因此编译时错误&#34; 用户已声明且未使用&# 34。

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

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)