123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package reflectutils
- import "reflect"
- // GroupTypeKind 将反射的Kind值进行聚集
- func GroupTypeKind(t reflect.Type) reflect.Kind {
- kind := t.Kind()
- switch {
- case kind >= reflect.Int && kind <= reflect.Int64:
- return reflect.Int64
- case kind >= reflect.Uint && kind <= reflect.Uint64:
- return reflect.Uint64
- case kind >= reflect.Float32 && kind <= reflect.Float64:
- return reflect.Float64
- default:
- return kind
- }
- }
- func PointerTypeElem(t reflect.Type) reflect.Type {
- elem := t
- if t.Kind() == reflect.Ptr {
- elem = t.Elem()
- }
- return elem
- }
- func SliceTypeElem(t reflect.Type) reflect.Type {
- elem := t
- if t.Kind() == reflect.Slice {
- elem = t.Elem()
- }
- return elem
- }
- func IsSliceTypeOf(t reflect.Type, elementKind reflect.Kind) bool {
- return t.Kind() == reflect.Slice && t.Elem().Kind() == elementKind
- }
- func IsTypeInteger(t reflect.Type) bool {
- return t.Kind() >= reflect.Int && t.Kind() <= reflect.Int64
- }
- func IsTypeUnsignedInteger(t reflect.Type) bool {
- return t.Kind() >= reflect.Uint && t.Kind() <= reflect.Uint64
- }
- func IsTypeFloat(t reflect.Type) bool {
- return t.Kind() >= reflect.Float32 && t.Kind() <= reflect.Float64
- }
- func IsTypeStructPointer(t reflect.Type) bool {
- return t.Kind() == reflect.Pointer && t.Elem().Kind() == reflect.Struct
- }
- func IsTypeStructOrStructPointer(t reflect.Type) bool {
- return t.Kind() == reflect.Struct || IsTypeStructPointer(t)
- }
- func IsTypeStructSliceOrStructSlicePointer(t reflect.Type) bool {
- return IsSliceTypeOf(t, reflect.Struct) || (t.Kind() == reflect.Pointer && IsSliceTypeOf(t.Elem(), reflect.Struct))
- }
- func IsTypeTime(t reflect.Type) bool {
- return t.Kind() == reflect.Struct && t.String() == "time.Time"
- }
- func IsTypeTimePointer(t reflect.Type) bool {
- return t.Kind() == reflect.Pointer && IsTypeTime(t.Elem())
- }
- func ZeroType(t reflect.Type) reflect.Value {
- zeroValue := reflect.New(t).Elem()
- if zeroValue.Kind() != reflect.Pointer {
- zero(&zeroValue)
- return zeroValue
- }
- zeroValue.Set(reflect.New(zeroValue.Type().Elem()))
- elemValue := PointerValueElem(zeroValue)
- zero(&elemValue)
- return zeroValue
- }
- func ZeroTypeToAny(t reflect.Type) any {
- zeroValue := reflect.New(t).Elem()
- if zeroValue.Kind() != reflect.Pointer {
- zero(&zeroValue)
- return zeroValue.Interface()
- }
- zeroValue.Set(reflect.New(zeroValue.Type().Elem()))
- elemValue := PointerValueElem(zeroValue)
- zero(&elemValue)
- return zeroValue.Interface()
- }
|