github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/core/common/check/check.go (about) 1 package check 2 3 import ( 4 "github.com/nyan233/littlerpc/core/middle/codec" 5 lreflect "github.com/nyan233/littlerpc/internal/reflect" 6 "reflect" 7 ) 8 9 // UnMarshalFromUnsafe structPtr == nil时不会返回空结果, 而是构造一个*interface{}传给 10 // Codec做为反序列化的类型, 这是反序列化出的具体类型由特定的Codec进行选择, 有些要求一定要具体类型的serialization 11 // 可能会Panic, 比如protobuf 12 // data中没数据时返回nil结果, 而不关心structPtr中的数据 13 func UnMarshalFromUnsafe(codec codec.Codec, data []byte, value interface{}) (interface{}, error) { 14 if data == nil || len(data) == 0 { 15 return nil, nil 16 } 17 var marshalValue interface{} 18 if value == nil { 19 marshalValue = new(interface{}) 20 value = interface{}(1) 21 } else { 22 marshalValue, _ = lreflect.ToTypePtr(value) 23 } 24 err := codec.Unmarshal(data, marshalValue) 25 if err != nil { 26 return nil, err 27 } 28 // 指针类型和非指针类型的返回值不同 29 if reflect.TypeOf(value).Kind() == reflect.Ptr { 30 return value, nil 31 } else { 32 return reflect.ValueOf(marshalValue).Elem().Interface(), nil 33 } 34 }