go: 高性能序列化,反序列化 有时,需要将go的struct序列化为`[]byte`,或将其反解还原。 go的官方提供了`gob`库,但使用msgpack库可以有更好的性能。 特别注意: 1. 如果struct中有字段的类型是接口,则需要预先使用`msgpack.RegisterExt`注册其所有的实现。否则将会panic。例如,在proto类型中的oneof等类型,生成的go struct就是interface类型。 2. 被编码解码的struct中,**仅public的字段**会参与编解码。 ``` package main import ( "fmt" "log" "github.com/vmihailenco/msgpack/v5" ) func init(){ msgpack.RegisterExt(0, &pb.Val_Bytes{}) msgpack.RegisterExt(1, &pb.Val_Double{}) // 有时候,proto中的oneof等Interface,需要先注册值 } func main() { tp := new(TStruct) tp.M = map[string]string{ "hello": "hi", } tp.Data = []byte("hello world") b, err := msgpack.Marshal(tp) if err != nil { panic(err) } // log.Printf("%s", b) tp2 := new(TStruct) err = msgpack.Unmarshal(b, tp2) if err != nil { panic(err) } log.Printf("%v", tp2) } type TStruct struct { M map[string]string Data []byte } func (t *TStruct) String() string { return fmt.Sprintf("%v %s", t.M, t.Data) } ``` 来自 大脸猪 写于 2021-04-21 14:49 -- 更新于2023-07-13 10:41 -- 0 条评论