dongwo2222 2016-05-05 08:15
浏览 182
已采纳

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

I have a struct and I am trying to iterate through all fields to determine whether or not the field is a map (or a pointer to a map). I'm able to compare field kind to reflect.Map for non-pointer fields, but I am having trouble doing the same for pointer fields. If the field has a value I can use Elem() to determine the pointer field type, but if the field is nil that method won't work and I get "invalid." Any ideas on how to accomplish this? Playground is here.

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条回答 默认 最新

  • douwenpin0428 2016-05-05 08:56
    关注

    Work with types instead of 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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部