作为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)
我意识到我可以在条件块之前声明err
和user
变量,但我想知道为什么这不起作用。是否与一次创建两个新变量有关?
UDPATE 搞得一团糟。
我现在有了:
user := core.User{}
if req.Id == nil {
user, err := signup(C, c, &req)
} else {
user, err := update(C, c, &req)
}
cleanUser(&user)
现在我的错误是用户已声明且未使用。我目前不是在处理错误部分,但我不确定为什么我会收到有关用户的错误。
答案 0 :(得分:10)
这是因为您正在创建的err
变量的范围:它只在范围内(因此有效/可参考)直到您声明它的最内层块的末尾。
在函数内声明的常量或变量标识符的范围从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)
}
或使用一行声明user
和err
:
user, err := core.User{}, error(nil)