github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/core/middle/codec/codec.go (about)

     1  package codec
     2  
     3  import (
     4  	"encoding/json"
     5  )
     6  
     7  type Codec interface {
     8  	Scheme() string
     9  	Marshal(v interface{}) ([]byte, error)
    10  	Unmarshal(data []byte, v interface{}) error
    11  }
    12  
    13  var (
    14  	codecCollection = make(map[string]Codec, 8)
    15  )
    16  
    17  // Register 注册一个Code, 按照定义的scheme获取Codec
    18  // 从v0.4.0版本开始LittleRpc在Codec中使用普通map来管理
    19  func Register(c Codec) {
    20  	if c == nil {
    21  		panic("codec is nil")
    22  	}
    23  	if c.Scheme() == "" {
    24  		panic("codec scheme is empty")
    25  	}
    26  	codecCollection[c.Scheme()] = c
    27  }
    28  
    29  // Get 根据Scheme获取Codec, 如果Codec不存在, 那么返回的Codec == nil
    30  // 从v0.4.0版本开始LittleRpc在Codec中使用普通map来管理
    31  func Get(scheme string) Codec {
    32  	return codecCollection[scheme]
    33  }
    34  
    35  type Json struct{}
    36  
    37  func (j Json) Scheme() string {
    38  	return "json"
    39  }
    40  
    41  func (j Json) Marshal(v interface{}) ([]byte, error) {
    42  	return json.Marshal(v)
    43  }
    44  
    45  func (j Json) Unmarshal(data []byte, v interface{}) error {
    46  	return json.Unmarshal(data, v)
    47  }
    48  
    49  func init() {
    50  	Register(new(Json))
    51  }