在某些情况下,调用值为 panics 的 NumField 函数(Go 语言)。

huangapple go评论79阅读模式
英文:

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
}

huangapple
  • 本文由 发表于 2022年3月19日 07:15:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/71534112.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定