【问题标题】:interface conversion: interface{} is nil, not bool接口转换:interface{} 为 nil,而不是 bool
【发布时间】:2021-09-04 19:32:25
【问题描述】:

我对 Go 比较陌生。

我正在对现有项目进行更改。 我需要检索可能存在于 HTTP 请求正文中的元素值并将其弹出。

var returnValues = body.Params["returnValues"].(bool)
delete(body.Params, "returnValues")

我在第一行遇到错误。

接口转换:interface {} 为 nil,而不是 bool

样本主体:

{
"Params": {
    "returnValues": true
    }
}

【问题讨论】:

  • 您的代码中是否有任何 json 结构或要解码的内容?您在哪里将您的请求正文解组为 Go 对象?
  • 这意味着body.Params 映射没有returnValues 键,或者它有它但它是零。你如何构造body.Params
  • “我需要检索一个可能存在在 HTTP 请求正文中的元素的值并将其弹出。” -- 你是收到错误,因为它不存在。你应该永远var v = x.(bool),除非你确定x包含一个bool值。如果在某些情况下它可能不是bool,那么您的程序会在遇到这些情况时崩溃。如果您想避免崩溃,请使用“comma ok”成语,例如var v, ok = x.(bool).

标签: go go-gin


【解决方案1】:

如果您访问接口映射或默认 nil 类型并使用该映射执行操作,请确保该键的值在使用之前存在于映射中。如果映射中不存在该值,它将返回 nil 并使用 nil 引用进行恐慌。

r, ok := body.Params["returnValues"]
    if !ok {
        // returnValues not present in Params map. Handle the scenario
        // and don't continue below 
    }
    var returnValues = r.(bool)
    delete(body.Params, "returnValues")

此外,如果您不确定要访问的变量类型,请使用类型断言并查看您的类型是否正常。那么如果它为null,那么它也为类型断言返回false。

returnValues, ok := body.Params["returnValues"].(bool)
    if !ok {
        // returnValues may not present in Params map. or it is not an 
        // boolean type, handle scenario here
    }
    delete(body.Params, "returnValues")

【讨论】:

  • 这可能仍然失败,非常可怕。而不是在读取的地图上使用“comma ok”习语,在这种情况下,您应该在类型断言上使用它。
  • 是的,这也是一个更好的选择。我也会补充的。
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2022-01-24
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多