Go中未定义的变量

我收到一个错误:undefined: req during compiler。我明白为什么我会收到错误,但我不知道如何克服它。这是我的代码:


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 请求,然后将它们添加到上下文中。我重新考虑,如果我req在switch语句之前定义我的变量,那么这应该可以解决问题,但我不知道最初将它声明为什么类型?


隔江千里
浏览 144回答 3
3回答

当年话下

Go使用 blocks 进行词法作用域。这意味着 的声明req仅在它们的代码块中可见,case在这个实例中是块。您需要req在同一范围或外部范围内声明要使用它的位置。var req interface{}switch path {case "user.save":    req = &SaveRequest{}case "user.update":     req = &UpdateRequest{}}err := c.BindJSON(req)

炎炎设计

这是因为您在 switch 语句中声明了它。无法保证在该err := c.BindJSON(&req)行执行时已定义任何一个。您可能知道,基于对输入的一些外部理解,这不会发生,但编译器不会。因此,您在每个 case 语句中声明的变量适用于该语句。您只需要进行一些重构。您可以将其err := c.BindJSON(&req)移至 case 语句中。您可以使用接口来更一般地声明变量,并在稍后处理它的类型等。做你认为最好的阅读。您可能在其他类型系统有些相似的语言中遇到过这种情况(例如,在 C、C++、C# 和 Java 中也会发生同样的情况)。

慕桂英546537

将您的BindJSON逻辑移至switch语句中:var err errorswitch 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   }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go