为了账号安全,请及时绑定邮箱和手机立即绑定

Go中未定义的变量

Go中未定义的变量

Go
隔江千里 2021-11-29 15:38:40
我收到一个错误:undefined: req during compiler。我明白为什么我会收到错误,但我不知道如何克服它。这是我的代码:switch path {case "user.save":    var req SaveRequestcase "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 回答

?
当年话下

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)


查看完整回答
反对 回复 2021-11-29
?
炎炎设计

TA贡献1808条经验 获得超4个赞

这是因为您在 switch 语句中声明了它。无法保证在该err := c.BindJSON(&req)行执行时已定义任何一个。您可能知道,基于对输入的一些外部理解,这不会发生,但编译器不会。因此,您在每个 case 语句中声明的变量适用于该语句。

您只需要进行一些重构。您可以将其err := c.BindJSON(&req)移至 case 语句中。您可以使用接口来更一般地声明变量,并在稍后处理它的类型等。做你认为最好的阅读。您可能在其他类型系统有些相似的语言中遇到过这种情况(例如,在 C、C++、C# 和 Java 中也会发生同样的情况)。


查看完整回答
反对 回复 2021-11-29
?
慕桂英546537

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   

}


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信