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  // ---------------------------------------------------------------------------------------------------------------------