1 回答
TA贡献1963条经验 获得超6个赞
Value.IsZero()
报告包装的值是否是其类型的零值。这与reflect.Value
自身为零(reflect.Value
其零值是结构)不同。
另请注意,t
在您的代码中不是结构值,它是指向结构的指针。用于Value.Elem()
导航到包装的结构值(或不从指针开始)。
如果该字段不存在,Value.FieldByName()
则返回 的零值reflect.Value
,而不是reflect.Value
持有某种类型的零值的非零值;如果找不到字段,则没有类型信息。
因此,要检查该字段是否不存在,请reflect.Value
通过将其与以下内容进行比较来检查其本身是否为零reflect.Value{}
:
if field == (reflect.Value{}) {
log.Printf("Field %s was not on the struct", name)
}
测试它:
type test struct {
A bool
B bool
x bool
}
v := new(test)
metaValue := reflect.ValueOf(v).Elem()
for _, name := range []string{"A", "x", "y"} {
field := metaValue.FieldByName(name)
if field == (reflect.Value{}) {
log.Printf("Field %s was not on the struct", name)
}
}
这将输出(在Go Playground上尝试):
2009/11/10 23:00:00 Field y was not on the struct
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报