Go中未定义的变量

Go中未定义的变量,go,Go,我在编译期间收到一个错误:未定义:req。我理解为什么我会犯错误,但我不知道如何克服它。这是我的代码: switch path { case "user.save": var req SaveRequest case "user.update": var req UpdateRequest } err := c.BindJSON(&req) if err != nil { c.JSON(http.StatusOK, gin.H{"error_code": "

我在编译期间收到一个错误:未定义:req。我理解为什么我会犯错误,但我不知道如何克服它。这是我的代码:

switch path {
case "user.save":
    var req SaveRequest
case "user.update": 
    var req UpdateRequest
}

err := c.BindJSON(&req)
if  err != nil {
    c.JSON(http.StatusOK, gin.H{"error_code": "SERVER_ERROR", "message": "Request is not valid JSON"})
    return   
}

c.Set("req", req)

我试图解析JSON请求,然后将它们添加到上下文中。我想如果我在
switch
语句之前定义了
req
变量,那么这应该可以解决问题,但我不知道最初将其声明为什么类型?

这是因为您在switch语句中声明了它。无法保证在执行
err:=c.BindJSON(&req)
行时已定义了这两个选项。您可能知道,基于对输入的一些外部理解,这不会发生,但编译器不会。因此,您在每个case语句中声明的变量都是该语句的作用域


你只需要做一点重构。您可以将这个
err:=c.BindJSON(&req)
移动到case语句中。您可以使用接口更一般地声明变量,并在以后处理它的类型。做你认为最好的事。您可能遇到了其他语言类型相似的系统(例如,C、C++、C和java中都发生了相同的情况)。< /P> < P>将您的<代码> BindJSON <代码>逻辑转换成<代码>开关< /C> >语句:

var err error
switch path {
case "user.save":
    var req SaveRequest
    err = c.BindJSON(&req)
case "user.update": 
    var req UpdateRequest
    err = c.BindJSON(&req)
}

if  err != nil {
    c.JSON(http.StatusOK, gin.H{"error_code": "SERVER_ERROR", "message": "Request is not valid JSON"})
    return   
}
去吧。这意味着
req
的声明仅在其代码块中可见,在本例中为
case

您需要在要使用它的同一作用域或外部作用域中声明
req

var req interface{}
switch path {
case "user.save":
    req = &SaveRequest{}
case "user.update": 
    req = &UpdateRequest{}
}

err := c.BindJSON(req)

谢谢你-我忘了显示我也在更远的地方调用了
req
,所以我仍然会遇到同样的错误。你能稍微修改一下你的回答吗?我已经更新了我的代码示例。这不是因为它不被允许,或者这两个路径都没有被执行,只是因为Go是使用块的词汇范围(与类型系统也没有任何关系)@JimB很好,这是糟糕的措辞。你知道我的意思,但这在技术上是错误的。也许我会编辑,也许你的评论就足够了。谢谢-是的,我了解范围。我只是不知道如何在这个实例中最好地构造代码@tommyd456:如果您希望
req
可能是多种类型,那么您需要使用
接口{}
(或者更具体的公共接口,如果有)谢谢-我不知道如何以那种方式使用
接口{}