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 關注
- 130 瀏覽
添加回答
舉報