使用反射在Golang中打印结构体指针字段类型

5
我有一个结构体,想要遍历所有字段以确定该字段是否为映射(或映射的指针)。对于非指针字段,我可以将字段类型与reflect.Map进行比较,但是对于指针字段,我遇到了困难。如果字段具有值,我可以使用Elem()方法确定指针字段类型,但是如果字段为nil,则该方法将无法工作且显示“invalid”。您有什么关于如何完成此操作的建议吗?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个回答

12

使用类型而不是进行操作:

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())
}

示例代码

这是一个关于Go语言的示例代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接