1 回答
TA贡献1776条经验 获得超12个赞
无法确定某个字段是否显式分配了一个值,但可以确定是否存在不等于该字段零值的字段。
遍历字段。如果字段的值不等于字段类型的零值,则返回 true。
func hasNonZeroField(s interface{}) bool {
v := reflect.ValueOf(s)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
t := v.Type()
for i := 0; i < t.NumField(); i++ {
sf := t.Field(i)
fv := v.Field(i)
switch sf.Type.Kind() {
case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
if !fv.IsNil() {
return true
}
case reflect.Struct:
if hasNonZeroField(fv.Interface()) {
return true
}
// case reflect.Array:
// TODO: call recursively for array elements
default:
if reflect.Zero(sf.Type).Interface() != fv.Interface() {
return true
}
}
}
return false
}
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报