Go 未定义的err变量

Go 未定义的err变量,go,Go,作为一名“新手”,我不确定在编译程序时为什么会在控制台中收到错误未定义错误和未定义用户 我有: 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) 我意识到我可能

作为一名“新手”,我不确定在编译程序时为什么会在控制台中收到错误未定义错误未定义用户

我有:

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)

我的错误现在是用户声明的,未使用的。目前我没有处理err部分,但我不确定为什么会出现关于用户的错误。

这是因为您正在创建的
err
变量的范围:它只在范围内(因此有效/可引用),直到您声明它的最内层块结束

规格:

在函数中声明的常量或变量标识符的范围从ConstSpec或VarSpec(ShortVarDecl表示短变量声明)的末尾开始,结束于最内部包含块的末尾

当您在
if
语句之前声明它时,它将一直在范围内,直到容器块的末尾,其中还包括第二个
if
,在这里您测试
err
变量,所以这是正常的

UDPATE:

更新到您的更新:您使用了创建新变量的,因为您在新块中使用了它。您没有使用这些新变量(只有在内部块之外声明的“other”
user
),因此出现编译时错误“user declared and not used”

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

或者使用一行声明
用户
错误

user, err := core.User{}, error(nil)

谢谢你的回答——虽然有点混乱,但还是更新了我的问题。任何代码示例都将不胜感激
user, err := core.User{}, error(nil)