github.com/nyan233/littlerpc@v0.4.6-0.20230316182519-0c8d5c48abaf/core/middle/packer/packet.go (about) 1 package packer 2 3 // Packer 负责解包/拆包的实例要实现的接口 4 // 获得数据是经过json encode之后的Body,Header不会被发送到此处理 5 // 默认实现text&gzip 6 type Packer interface { 7 Scheme() string 8 // EnPacket 装包 9 EnPacket(p []byte) ([]byte, error) 10 // UnPacket 拆包 11 UnPacket(p []byte) ([]byte, error) 12 } 13 14 var ( 15 packerCollection = make(map[string]Packer, 8) 16 ) 17 18 // Text 注意:text类型的压缩器只是提供给client&server 19 // 的一个提示,client&server的代码应该针对此特殊处理,真实调用会导致panic 20 type Text struct{} 21 22 func (t Text) Scheme() string { 23 return "text" 24 } 25 26 func (t Text) EnPacket(p []byte) ([]byte, error) { 27 panic(interface{}("text packet not able call")) 28 } 29 30 func (t Text) UnPacket(p []byte) ([]byte, error) { 31 panic(interface{}("text packet not able call")) 32 } 33 34 // Register 该调用是线程安全的 35 func Register(p Packer) { 36 if p == nil { 37 panic("encoder is empty") 38 } 39 if p.Scheme() == "" { 40 panic("encoder scheme is empty") 41 } 42 packerCollection[p.Scheme()] = p 43 } 44 45 // Get 该调用是线程安全的 46 func Get(scheme string) Packer { 47 return packerCollection[scheme] 48 } 49 50 func init() { 51 Register(new(Text)) 52 Register(new(Gzip)) 53 }