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
    ListFields(&x)
}

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

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

报告相同问题?

悬赏问题

  • ¥23 (标签-bug|关键词-密码错误加密)
  • ¥66 比特币地址如何生成taproot地址
  • ¥20 数学建模数学建模需要
  • ¥15 关于#lua#的问题,请各位专家解答!
  • ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
  • ¥15 不知道是该怎么引用多个函数片段
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决