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 }