github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/internal/reflect/identity.go (about)

     1  package reflect
     2  
     3  import (
     4  	"reflect"
     5  	"unsafe"
     6  )
     7  
     8  // IdentifyTypeNoInfo 无类型信息的识别,识别一些简单类型的长度并返回它们的指针
     9  // 只支持32-64位长度的类型
    10  func IdentifyTypeNoInfo(value interface{}) (unsafe.Pointer, int) {
    11  	inter := (*Eface)(unsafe.Pointer(&value))
    12  	switch value.(type) {
    13  	case int32, uint32, float32:
    14  		return inter.data, 4
    15  	case int64, uint64, float64:
    16  		return inter.data, 8
    17  	default:
    18  		return nil, 0
    19  	}
    20  }
    21  
    22  // IdentArrayOrSliceType 识别数组/切片元素类型
    23  // type&data为nil则直接返回nil,有类型信息则新建再识别
    24  func IdentArrayOrSliceType(value interface{}) interface{} {
    25  	if value == nil {
    26  		return nil
    27  	}
    28  	typ := reflect.TypeOf(value)
    29  	if !(typ.Kind() == reflect.Slice || typ.Kind() == reflect.Array) {
    30  		panic(interface{}("value type is not a slice or array"))
    31  	}
    32  	val := reflect.ValueOf(value)
    33  	// 为0则动态创建再判断类型
    34  	if val.Len() == 0 {
    35  		val = reflect.MakeSlice(typ, 1, 1)
    36  	}
    37  	return val.Index(0).Interface()
    38  }