一尘不染

打印Golang地图的键/值类型

go

我正在尝试打印地图的类型,例如:map [int] string

func handleMap(m reflect.Value) string {

    keys := m.MapKeys()
    n := len(keys)

    keyType := reflect.ValueOf(keys).Type().Elem().String()
    valType := m.Type().Elem().String()

    return fmt.Sprintf("map[%s]%s>", keyType, valType)
}

所以如果我这样做:

log.Println(handleMap(make(map[int]string)))

我想得到 "map[int]string"

但我找不到正确的电话。


阅读 333

收藏
2020-07-02

共1个答案

一尘不染

尽量不要使用reflect。但是,如果您必须使用reflect

  • reflect.Value值具有Type()函数,该函数返回一个reflect.Type值。
  • 如果该类型Kind()reflect.Map,则这reflect.Valuemap[T1]T2某些类型T1和T2 的type值,其中T1是键类型,T2是元素类型。

因此,在使用时reflect,我们可以像这样将片段分开:

func show(m reflect.Value) {
    t := m.Type()
    if t.Kind() != reflect.Map {
        panic("not a map")
    }
    kt := t.Key()
    et := t.Elem()
    fmt.Printf("m = map from %s to %s\n", kt, et)
}

在Go
Playground上查看更完整的示例
。(请注意,两个映射实际上都是nil,因此没有要枚举的键和值。)

2020-07-02