【问题标题】:golang type assertion on map is panicking [duplicate]地图上的golang类型断言令人恐慌[重复]
【发布时间】:2020-01-22 02:44:09
【问题描述】:

地图上的类型断言不起作用,这是正确的做法吗?

详细说明一下,我的目标是返回一个动态类型的地图。此示例仅用于演示。

package main

import "fmt"

func main()  {
    m := hello().(map[string]int)
    fmt.Println(m)
}

func hello() interface{} {
    return map[string]interface{} {
        "foo": 2,
        "bar": 3,
    }
}

它恐慌

panic:接口转换:interface {} 是 map[string]interface {}, 不是 map[string]int

【问题讨论】:

  • 有什么问题吗? map[string]interface{} 不是 map[string]int 所以类型断言失败。
  • 我是否可以假设地图的键为字符串,值为 int?使用其他类型的类型断言,然后 map 适用于这些假设
  • 您不能对不兼容的类型进行类型断言。您必须手动转换它。

标签: go


【解决方案1】:

返回合适的类型

package main

import "fmt"

func main()  {
    m := hello().(map[string]int)
    fmt.Println(m)
}

func hello() interface{} {
    return map[string]int{
        "foo": 2,
        "bar": 3,
    }
}

【讨论】:

  • 我不能随意返回静态类型,映射可以将任何类型作为键和任何类型作为值。现在为了演示,我将这些值视为接口。我这样做对吗?
  • 所以你需要 map[interface{}]interface{}
  • 是的,如果我现在能弄清楚 map[string]interface{},我稍后会看到第二部分。
  • Just to elaborate, my goal is to return a map with dynamic types go 中没有这样的东西。但是,您可以使用 interface{} 来混合多种类型。
  • 我在某种程度上使用反射来实现这一点。使用其他类型它可以工作,但使用地图我收到此错误。
【解决方案2】:

为了回答我自己的问题,断言适用于地图值

几个例子

package main

import "fmt"

type person struct {
    name string
}

func main()  {
    m := example1().(map[string]interface{})

    fmt.Println(m["foo"].(int))

    m2 := example2().(map[string]interface{})

    fmt.Println(m2["foo"].(person).name)

}

func example1() interface{} {
    return map[string]interface{} {
        "foo": 2,
        "bar": 3,
    }
}

func example2() interface{} {
    m := make(map[string]interface{})

    m["foo"] = person{"Name is foo!"}
    m["bar"] = person{"Name is bar!"}

    return m
}

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 2020-10-23
    • 2015-09-28
    • 2011-01-11
    • 2017-05-07
    • 2014-09-21
    • 2014-10-10
    • 2015-02-19
    相关资源
    最近更新 更多