英文:
Confirm struct fields non-zero in Go
问题
我正在尝试编写一个通用函数,该函数接受一个struct
并确认给定的字段具有非零值。
这是我的函数:
func CheckRequiredFields(kind string, i interface{}, fields ...string) error {
for _, field := range fields {
value := reflect.ValueOf(i).FieldByName(field)
if value.Interface() == reflect.Zero(value.Type()).Interface() {
return fmt.Errorf("missing required %s field %s", kind, field)
}
}
return nil
}
如果将struct
作为i
传入,它可以正常工作,但如果i
是指向struct
的指针,则会失败。
如果传入的值是指针,我该如何反射接口的值呢?
英文:
I am trying to write a generic function that takes a struct
and confirms that the given fields have non-zero values.
This is my function:
func CheckRequiredFields(kind string, i interface{}, fields ...string) error {
for _, field := range fields {
value := reflect.ValueOf(i).FieldByName(field)
if value.Interface() == reflect.Zero(value.Type()).Interface() {
return fmt.Errorf("missing required %s field %s", kind, field)
}
}
return nil
}
and it works well if a struct
is passed in as i
, but fails if i
is a pointer to a struct
.
How can I reflect on the value of an interface if the value passed in is a pointer?
答案1
得分: 1
你可以使用reflect.Indirect
函数,它返回v指向的值。如果v是一个空指针,Indirect
函数会返回一个零值。如果v不是指针,Indirect
函数会返回v本身。
如果你想检查值是否为指针类型,可以使用Kind
方法,并使用Elem()
方法解引用指针。
v := reflect.ValueOf(i)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
英文:
You can use reflect.Indirect
, which returns the value that v points to. If v is a nil pointer, Indirect returns a zero Value. If v is not a pointer, Indirect returns v.
If you want to check if the value was a pointer or not, check it's Kind
, and use Elem()
to dereference the pointer.
v := reflect.ValueOf(i)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论