如何使用 Go 反射 pkg 获取切片结构字段的类型?
How to use Go reflection pkg to get the type of a slice struct field?
我正在尝试使用反射来构建一个例程,该例程将列出传入的任意结构中所有字段的名称、种类和类型。这是我目前所获得的:
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", n, f.Kind(), t)
}
}
func main() {
var x Bar
ListFields(&x)
}
输出结果如下:
Name: Status Kind: int Type: StatusVal
Name: FSlice Kind: slice Type:
当字段为切片时,类型为空白。我尝试了几种方法来获取切片的数据类型,但所有尝试都导致了恐慌......通常是这个:
reflect: call of reflect.Value.Elem on slice Value
需要对此代码进行哪些更改才能在输出中列出所有字段(包括切片)的类型?
这里是游乐场link:https://play.golang.org/p/zpfrYkwvlZ
type literal 中给出的切片类型,如 []Foo
是 unnamed 类型,因此 Type.Name()
returns 空字符串 ""
.
改用Type.String()
:
t := f.Type().String()
然后输出(在Go Playground上试试):
Name: Status Kind: int Type: main.StatusVal
Name: FSlice Kind: slice Type: []main.Foo
查看相关问题以了解有关类型及其名称的更多信息:
我正在尝试使用反射来构建一个例程,该例程将列出传入的任意结构中所有字段的名称、种类和类型。这是我目前所获得的:
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", n, f.Kind(), t)
}
}
func main() {
var x Bar
ListFields(&x)
}
输出结果如下:
Name: Status Kind: int Type: StatusVal
Name: FSlice Kind: slice Type:
当字段为切片时,类型为空白。我尝试了几种方法来获取切片的数据类型,但所有尝试都导致了恐慌......通常是这个:
reflect: call of reflect.Value.Elem on slice Value
需要对此代码进行哪些更改才能在输出中列出所有字段(包括切片)的类型?
这里是游乐场link:https://play.golang.org/p/zpfrYkwvlZ
type literal 中给出的切片类型,如 []Foo
是 unnamed 类型,因此 Type.Name()
returns 空字符串 ""
.
改用Type.String()
:
t := f.Type().String()
然后输出(在Go Playground上试试):
Name: Status Kind: int Type: main.StatusVal
Name: FSlice Kind: slice Type: []main.Foo
查看相关问题以了解有关类型及其名称的更多信息: