我能否确定在golang中

时间:2018-10-16 02:54:23

标签: go reflection

我的结构如下:

type Demo struct{
     A string
     B string
}

我有一个实例,如下所示:

demo := Demo{A:"a"}

A 字段分配了明确的值,但没有为 B 字段分配值。 现在,我想知道是否存在一些方法可以获取实例 A 的字段,该实例已通过 reflection 分配了值?< / p>

在这里我要获得字段 A

1 个答案:

答案 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
}

Run it on the playground