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?

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)

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).

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   
}