通过标签找指定列的值

2019-02-14  本文已影响0人  funcx
func getStructFieldValByBsonTag(obj reflect.Value, tag string) (interface{}, bool) {
    for i := 0; i < obj.NumField(); i++ {
        switch obj.Field(i).Kind() {
        case reflect.Struct:
            return getStructFieldValByBsonTag(obj.Field(i), tag)
        default:
            if obj.Type().Field(i).Tag.Get("bson") == tag {
                return obj.Field(i).Interface(), true
            }
        }
    }
    return nil, false
}

func GetFieldValByBsonTag(ptr interface{}, tag string) interface{} {
    t := reflect.TypeOf(ptr).Elem()
    v := reflect.ValueOf(ptr).Elem()
    for i := 0; i < t.NumField(); i++ {
        switch t.Field(i).Type.Kind() {
        case reflect.Struct:
            if res, ok := getStructFieldValByBsonTag(v.Field(i), tag); ok {
                return res
            }
        default:
            if t.Field(i).Tag.Get("bson") == tag {
                return v.Field(i).Interface()
            }
        }
    }
    panic("GetFieldValByBsonTag panic")
}
上一篇下一篇

猜你喜欢

热点阅读