反映一片地图,每个地图都是struct类型?

时间:2017-02-22 18:14:29

标签: dictionary go struct

我正在尝试遍历Card interface dialogCommands。我可以正常迭代它,每slice Println给我一个Index。但是,此map打印为类型map

struct

此输出是

    if reflect.TypeOf(dialogCommands).Kind() == reflect.Slice {
    commands := reflect.ValueOf(dialogCommands)

    for i:=0; i<commands.Len(); i++ {
        v := commands.Index(i)
        fmt.Println(reflect.TypeOf(v).Kind())
        fmt.Println(v)
    }

如您所见,类型为struct map[options:[a b c]] struct map[startDialogs:[dialog1]] ,但输出为struct。如何遍历map的{​​{1}}?我不能仅仅将它视为地图,因为它的类型为keys,所以我需要一种方法来迭代它,但正如您所见,vreflect.Valuekind }说它是struct

更新

这是Println结构

map

并记住Dialog已被解组为type Dialog struct { Dialog bson.Raw `json:"dialog" bson:"dialog"` }

dialogCommands

1 个答案:

答案 0 :(得分:0)

表达式reflect.TypeOf(v).Kind()返回v的类型,而不是v中的基础值。变量v的类型为reflect.Value。这是一种结构类型。

以下打印语句将打印您期望的假设dialogCommands是一片地图:

    fmt.Println(v.Kind())  // prints the kind of v's underlying value
    fmt.Println(v)         // prints v's underlying value

根据您对此问题的评论,看起来dialogCommands是一个接口片段。如果是这样,那么您将需要使用接口的元素:

    if v.Kind() == reflect.Interface {
        v = v.Elem()
    }
    fmt.Println(v.Kind())  
    fmt.Println(v)