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  }