Go

时间:2015-12-09 18:11:45

标签: go

我在编译期间遇到错误: 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变量,那么这应该可以克服这个问题,但我不知道最初将它声明为什么类型?

3 个答案:

答案 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   
}