douyingbei1458
2015-12-09 18:11 阅读 75
已采纳

Go中未定义的变量

I'm getting an error: undefined: req during compilation. I understand why I'm getting the error but I'm not sure how to overcome it. This is my code:

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)

I'm trying to parse JSON requests and then add them to the context. I reaslise that if I define my req variable before the switch statement then this should overcome the problem but I don't know what type to declare it as initially?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    doulin2555 doulin2555 2015-12-09 18:34

    Go is lexically scoped using blocks. This means that the declarations of req are only visible within their code block, the case block in this instance.

    You need to declare req in the same scope, or an outer scope, from where you want to use it.

    var req interface{}
    switch path {
    case "user.save":
        req = &SaveRequest{}
    case "user.update": 
        req = &UpdateRequest{}
    }
    
    err := c.BindJSON(req)
    
    点赞 评论 复制链接分享
  • dtcd27183 dtcd27183 2015-12-09 18:14

    It's because you declare it in a switch statement. There is no guarantee that either will have been defined by the time the err := c.BindJSON(&req) line executes. You may know, based on some outside understanding of the input, that won't happen but the compiler cannot. The variables you declare within each case statement are therefor scoped for that statement.

    You just need to do a little refactoring. You could move this err := c.BindJSON(&req) into the case statements. You could use an interface to declare the variable more generically and deal with it's type later on ect. Do what you think reads best. Likely you've encountered this in other languages with somewhat similar type systems (same happens in C, C++, C# and Java for example).

    点赞 评论 复制链接分享
  • dongya1875 dongya1875 2015-12-09 18:15

    Move your BindJSON logic into the switch statement:

    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   
    }
    
    点赞 评论 复制链接分享

相关推荐