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")
}
网友评论