3 回答
TA贡献1890条经验 获得超9个赞
Go使用 blocks 进行词法作用域。这意味着 的声明req仅在它们的代码块中可见,case在这个实例中是块。
您需要req在同一范围或外部范围内声明要使用它的位置。
var req interface{}
switch path {
case "user.save":
req = &SaveRequest{}
case "user.update":
req = &UpdateRequest{}
}
err := c.BindJSON(req)
TA贡献1808条经验 获得超4个赞
这是因为您在 switch 语句中声明了它。无法保证在该err := c.BindJSON(&req)
行执行时已定义任何一个。您可能知道,基于对输入的一些外部理解,这不会发生,但编译器不会。因此,您在每个 case 语句中声明的变量适用于该语句。
您只需要进行一些重构。您可以将其err := c.BindJSON(&req)
移至 case 语句中。您可以使用接口来更一般地声明变量,并在稍后处理它的类型等。做你认为最好的阅读。您可能在其他类型系统有些相似的语言中遇到过这种情况(例如,在 C、C++、C# 和 Java 中也会发生同样的情况)。
TA贡献1848条经验 获得超10个赞
将您的BindJSON逻辑移至switch语句中:
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
}
- 3 回答
- 0 关注
- 143 浏览
添加回答
举报