1

如果有这样的结构:

type A struct {
  Arr []int
}

如何获取切片中的元素类型arr

比如传入一个空的A实例,如何获取int类型?

func PrintElementType(obj interface{}) {
    objType := reflect.TypeOf(obj)
    for i := 0; i < objType.NumField(); i++ {
        fieldType := objType.Field(i).Type
        // here I got 'slice'
        fmt.Println(fieldType.Kind())
        // here I got '[]int', I think 'int' type is stored somewhere...
        fmt.Println(fieldType)
        // so, is there any way to get 'int' type?
        fmt.Println("inner element type?")
    }
}

func main() {
    a := A{}
    PrintElementType(a)
}
4

1 回答 1

2

如果您有reflect.Type切片类型的类型描述符,请使用其Type.Elem()方法获取切片元素类型的类型描述符:

fmt.Println(fieldType.Elem())

Type.Elem()Array如果类型的 Kind 是, Chan, Map, Ptr, 或,也可以用于获取元素类型Slice,但否则它会恐慌。所以你应该在调用它之前检查类型:

if fieldType.Kind() == reflect.Slice {
    fmt.Println("Slice's element type:", fieldType.Elem())
}

这将输出(在Go Playground上尝试):

slice
[]int
Slice's element type: int
于 2021-06-30T13:46:23.590 回答