github.com/golang-infrastructure/go-reflect-utils@v0.0.0-20221130143747-965ef2eb09c3/slice.go (about) 1 package reflect_utils 2 3 import ( 4 "reflect" 5 "unsafe" 6 ) 7 8 type Comparator func(a any, b any) int 9 10 //func SliceSort(slice []any) { 11 // //reflect.DeepEqual() 12 //} 13 14 // 反射相关的操作 15 16 // 访问slice的元数据 17 // 通过指针直接访问等 18 19 // --------------------------------------------------------------------------------------------------------------------- 20 21 // IsSliceType 判断是否是切片类型 22 func IsSliceType(v any) bool { 23 of := reflect.TypeOf(v) 24 if of == nil { 25 return false 26 } 27 return of.Kind() == reflect.Slice 28 } 29 30 // IsArrayType 判断值是否是数组类型 31 func IsArrayType(v any) bool { 32 of := reflect.TypeOf(v) 33 if of == nil { 34 return false 35 } 36 return of.Kind() == reflect.Array 37 } 38 39 // IsSliceOrArrayType 判断是是否是切片或者数组类型 40 func IsSliceOrArrayType(v any) bool { 41 of := reflect.TypeOf(v) 42 if of == nil { 43 return false 44 } 45 return of.Kind() == reflect.Slice || of.Kind() == reflect.Array 46 } 47 48 // --------------------------------------------------------------------------------------------------------------------- 49 50 // IsSliceValue 判断存储的值是否是切片 51 func IsSliceValue(v any) bool { 52 of := reflect.ValueOf(v) 53 if !of.IsValid() { 54 return false 55 } 56 return of.Kind() == reflect.Slice 57 } 58 59 // IsArrayValue 判断存储的值是否是数组 60 func IsArrayValue(v any) bool { 61 of := reflect.ValueOf(v) 62 if !of.IsValid() { 63 return false 64 } 65 return of.Kind() == reflect.Array 66 } 67 68 // IsSliceOrArrayValue 判断存储的值是否是切片或数组 69 func IsSliceOrArrayValue(v any) bool { 70 of := reflect.ValueOf(v) 71 if !of.IsValid() { 72 return false 73 } 74 return of.Kind() == reflect.Slice || of.Kind() == reflect.Array 75 } 76 77 // --------------------------------------------------------------------------------------------------------------------- 78 79 // GetSliceHeader 通过反射获取切片的元数据信息 80 func GetSliceHeader[T any](slice []T) *reflect.SliceHeader { 81 return (*reflect.SliceHeader)(unsafe.Pointer(&slice)) 82 } 83 84 // ---------------------------------------------------------------------------------------------------------------------