使用reflect在golang中打印struct指针字段类型

时间:2016-05-05 16:15:51

标签: reflection go

我有一个结构,我试图遍历所有字段以确定该字段是否是地图(或指向地图的指针)。我能够比较字段种类以反映。非指针字段的地图,但是我在为指针字段做同样的事情时遇到了麻烦。如果该字段有值,我可以使用Elem()来确定指针字段类型,但如果该字段为nil,则该方法不起作用,并且我得到"无效。"有关如何实现这一目标的任何想法? Playground就在这里。

package main

import (
    "fmt"
    "reflect"
)

type Item struct {
    itemMap    map[string]interface{}
    itemMapPtr *map[string]interface{}
}

func main() {
    item := new(Item)
    printTypes(*item)
}

func printTypes(item Item) {
    itemVal := reflect.ValueOf(item)
    for i := 0; i < itemVal.NumField(); i++ {
        fieldVal := itemVal.Field(i)
        if fieldVal.Kind() == reflect.Ptr {
            fieldVal = fieldVal.Elem() // This is only helpful if the field is not nil
        }
        fmt.Println(fieldVal.Kind())
    }
}

1 个答案:

答案 0 :(得分:9)

使用types代替values

t := reflect.TypeOf(item)
for i := 0; i < t.NumField(); i++ {
    ft := t.Field(i).Type
    if ft.Kind() == reflect.Ptr {
        ft = ft.Elem()
    }
    fmt.Println(ft.Kind())
}

playground example