code: func getFieldValue(obj interface{}, key interface{}) interface{} {
  	var value reflect.Value
  	val := reflect.ValueOf(obj)
  	if val.Kind() == reflect.Ptr {
  		val = val.Elem()
  	}
  	switch val.Kind() {
  	case reflect.Struct:
  		value = val.FieldByName(key.(string))
  	case reflect.Map:
  		value = val.MapIndex(reflect.ValueOf(key))
  	case reflect.Slice:
  		if index, ok := key.(int); !ok {
  			return nil
  		} else if index >= 0 || val.Len() > index {
  			value = val.Index(index)
  		}
  	}
  	if !value.IsValid() {
  		return nil
  	}
  	return value.Interface()
  }
docs: // get value by key from struct | slice | map | wrap(prev)
  // when obj type is struct, the key's type must be string
  // ... slice, ... int
  // ... map, ... any type. But the type satisfies map's key definition(feature: compare...)