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
}