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 }