未定义的错误变量

tom*_*456 3 go

作为Go"newb",我不知道为什么我在编译程序时收到控制台中未定义错误未定义用户的错误.

我有:

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)
Run Code Online (Sandbox Code Playgroud)

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

UDPATE 搞得一团糟.

我现在有:

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

cleanUser(&user)
Run Code Online (Sandbox Code Playgroud)

我的错误现在是用户声明的而不是使用的.我现在不是在处理错误的部分,但我不确定为什么我会收到有关用户的错误.

icz*_*cza 10

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

规范:声明和范围

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

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

UDPATE:

更新到您的更新:您使用了一个Short变量声明,它创建了新变量,因为您在新块中使用了它.您尚未使用这些新变量(仅在user内部块外部声明的"其他" ),因此编译时错误" 用户声明且未使用".

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

或使用一行来声明两者usererr:

user, err := core.User{}, error(nil)
Run Code Online (Sandbox Code Playgroud)