duanqu9279 2017-02-17 09:22
浏览 92

如何使用Golang Reflection获得作为切片的struct字段的类型?

I'm trying to use reflection to build a routine that will list the Name, Kind and Type of all fields in an arbitrary struct that gets passed in. Here is what I've got so far:

type StatusVal int
type Foo struct {
    Name string
    Age  int
type Bar struct {
    Status StatusVal
    FSlice []Foo

func ListFields(a interface{}) {
    v := reflect.ValueOf(a).Elem()
    for j := 0; j < v.NumField(); j++ {
        f := v.Field(j)
        n := v.Type().Field(j).Name
        t := f.Type().Name()
        fmt.Printf("Name: %s  Kind: %s  Type: %s
", n, f.Kind(), t)

func main() {
    var x Bar

The output is as follows:

Name: Status  Kind: int  Type: StatusVal
Name: FSlice  Kind: slice  Type: 

When the field is a slice, the type is blank. I tried several ways to get the slice's data type, but all attempts resulted in a panic... usually this one:

reflect: call of reflect.Value.Elem on slice Value

What changes need to be made to this code so that the type for all fields, including slices, will be listed in the output?

Here's the playground link: https://play.golang.org/p/zpfrYkwvlZ

  • 写回答

1条回答 默认 最新

  • duancong6937 2017-02-17 09:26

    A slice type given in a type literal like []Foo is an unnamed type, hence Type.Name() returns an empty string "".

    Use Type.String() instead:

    t := f.Type().String()

    And then the output (try it on the Go Playground):

    Name: Status  Kind: int  Type: main.StatusVal
    Name: FSlice  Kind: slice  Type: []main.Foo

    See related question to know more about types and their names: Identify non builtin-types using reflect

    本回答被题主选为最佳回答 , 对您是否有帮助呢?



  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)