英文:
Calling NumField on Value panics in some cases (go)
问题
我正在使用reflect.ValueOf(..)来遍历结构体中的元素。我注意到,如果我在ValueOf函数中传递结构体而不是结构体指针,调用NumField会失败。
v = reflect.ValueOf(user)
v.NumField() // 报错
相比之下,
v = reflect.ValueOf(*user)
v.NumField() // 正常工作
在调用NumField之前,有没有办法事先判断v是否会报错?
英文:
I'm using reflect.ValueOf(..) to loop through elements in a struct. I noticed that calling NumField fails if i pass the struct vs. pointer to the struct in the ValueOf function.
v = reflect.ValueOf(user)
v.NumField() // panics
Vs.
v = reflect.ValueOf(*user)
v.NumField() // works
Is there a way to find out beforehand if v would panic, before calling NumField?
答案1
得分: 0
你必须检查“Kind”以确保它是一个结构。
英文:
You have to check the ‘Kind’ to ensure it’s a structure.
答案2
得分: 0
使用reflect.Indirect来处理问题中的两种情况:
v := reflect.Indirect(reflect.ValueOf(x))
v.NumField()
NumField的文档中提到:
> 如果v的Kind不是Struct,则会引发panic。
为了避免panic,可以检查kind:
if v.Kind() == reflect.Struct {
v.NumField()
} else {
// 做其他处理
}
英文:
Use reflect.Indirect to handle both cases in the question:
v := reflect.Indirect(reflect.ValueOf(x))
v.NumField()
The NumField documentation says:
> It panics if v's Kind is not Struct.
Check the kind to avoid the panic:
if v.Kind() == reflect.Struct {
v.NumField()
} else {
// do something else
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论