github.com/best4tires/kit@v1.0.5/reflex/reflect.go (about)

     1  package reflex
     2  
     3  import (
     4  	"reflect"
     5  	"strings"
     6  )
     7  
     8  func findFieldValue(v any, field string) (any, bool) {
     9  	rty := reflect.TypeOf(v)
    10  	if rty.Kind() != reflect.Struct {
    11  		return nil, false
    12  	}
    13  	rv := reflect.ValueOf(v)
    14  	for i := 0; i < rty.NumField(); i++ {
    15  		f := rty.Field(i)
    16  		if f.Name == field {
    17  			return rv.Field(i).Interface(), true
    18  		}
    19  		if jsonTag := f.Tag.Get("json"); jsonTag != "" {
    20  			jsonName, _, _ := strings.Cut(jsonTag, ",")
    21  			jsonName = strings.TrimSpace(jsonName)
    22  			if jsonName == field {
    23  				return rv.Field(i).Interface(), true
    24  			}
    25  		}
    26  	}
    27  	return nil, false
    28  }
    29  
    30  func baseKind(v any) reflect.Kind {
    31  	switch reflect.TypeOf(v).Kind() {
    32  	case reflect.Bool:
    33  		return reflect.Bool
    34  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
    35  		reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
    36  		return reflect.Int
    37  	case reflect.Float32, reflect.Float64:
    38  		return reflect.Float64
    39  	default:
    40  		return reflect.String
    41  	}
    42  }