我正在尝试编写一个带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
的指针则会失败。
如果传入的值是指针,我如何反映接口的值?
答案 0 :(得分:1)
您可以使用reflect.Indirect
,它返回v指向的值。如果v是nil指针,则Indirect返回零值。如果v不是指针,则间接返回v。
如果要检查值是否为指针,请检查它是Kind
,并使用Elem()
取消引用指针。
v := reflect.ValueOf(i)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}