我的结构如下:
type Demo struct{
A string
B string
}
我有一个实例,如下所示:
demo := Demo{A:"a"}
为 A 字段分配了明确的值,但没有为 B 字段分配值。 现在,我想知道是否存在一些方法可以获取实例 A 的字段,该实例已通过 reflection 分配了值?< / p>
在这里我要获得字段 A 。
答案 0 :(得分:1)
无法确定是否为字段明确分配了值,但是可以确定是否存在不等于该字段零值的字段。
在字段之间循环。如果字段的值不等于该字段类型的零值,则返回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
}