在某些情况下调用 NumField on Value panic (go)

Calling NumField on Value panics in some cases (go)

我正在使用 reflect.ValueOf(..) 循环遍历结构中的元素。我注意到,如果我在 ValueOf 函数中将结构与指针传递给结构,则调用 NumField 会失败。

v = reflect.ValueOf(user)
v.NumField() // panics

v = reflect.ValueOf(*user)
v.NumField() // works

有没有办法在调用 NumField 之前预先查明 v 是否会崩溃?

您必须检查“种类”以确保它是一个结构。

使用reflect.Indirect处理问题中的两种情况:

v := reflect.Indirect(reflect.ValueOf(x))
v.NumField()

NumField 文档说:

It panics if v's Kind is not Struct.

勾选种类避免恐慌:

if v.Kind() == reflect.Struct {
   v.NumField()
} else {
   // do something else
}