我在编译期间遇到错误: undefined:req 。我理解为什么我会收到错误,但我不确定如何克服它。这是我的代码:
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
变量,那么这应该可以克服这个问题,但我不知道最初将它声明为什么类型?
答案 0 :(得分:4)
Go是lexically scoped using blocks。这意味着req
的声明仅在其代码块中可见,在此实例中为case
块。
您需要在同一作用域或外部作用域中声明req
,以便从中使用它。
var req interface{}
switch path {
case "user.save":
req = &SaveRequest{}
case "user.update":
req = &UpdateRequest{}
}
err := c.BindJSON(req)
答案 1 :(得分:2)
这是因为你在switch语句中声明它。无法保证在err := c.BindJSON(&req)
行执行时定义任何一个。您可能知道,基于对输入的一些外部理解,这不会发生,但编译器不能。您在每个case语句中声明的变量都是针对该语句的作用域。
你只需要做一点重构。您可以将此err := c.BindJSON(&req)
移动到案例陈述中。你可以使用一个接口更一般地声明变量,然后在ect上处理它的类型。做你认为最好的。很可能你在其他语言中遇到过类似系统的类似系统(例如C,C ++,C#和Java)。
答案 2 :(得分:2)
将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
}