AddTo方法根据Field的类型做不同处理,如果是ReflectType类型,则执行的是enc.AddReflected(f.Key, f.Interface)
AddReflectedzap@v1.16.0/zapcore/json_encoder.go
func (enc *jsonEncoder) AddReflected(key string, obj interface{}) error { valueBytes, err := enc.encodeReflected(obj) if err != nil { return err } enc.addKey(key) _, err = enc.buf.Write(valueBytes) return err}func (enc *jsonEncoder) encodeReflected(obj interface{}) ([]byte, error) { if obj == nil { return nullLiteralBytes, nil } enc.resetReflectBuf() if err := enc.reflectEnc.Encode(obj); err != nil { return nil, err } enc.reflectBuf.TrimNewline() return enc.reflectBuf.Bytes(), nil}func (enc *jsonEncoder) resetReflectBuf() { if enc.reflectBuf == nil { enc.reflectBuf = bufferpool.Get() enc.reflectEnc = json.NewEncoder(enc.reflectBuf) // For consistency with our custom JSON encoder. enc.reflectEnc.SetEscapehtml(false) } else { enc.reflectBuf.Reset() }}jsonEncoder的AddReflected方法用enc.encodeReflected(obj)来序列化value;encodeReflected方法执行的是enc.resetReflectBuf()及enc.reflectEnc.Encode(obj);resetReflectBuf方法在reflectBuf为nil时创建reflectBuf及json.NewEncoder(enc.reflectBuf),不为nil时执行reflectBuf.Reset();enc.reflectEnc用的是golang内置的json encoder
json.Encode/usr/local/go/src/encoding/json/stream.go
func NewEncoder(w io.Writer) *Encoder { return &Encoder{w: w, escapeHTML: true}}func (enc *Encoder) Encode(v interface{}) error { if enc.err != nil { return enc.err } e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: enc.escapeHTML}) if err != nil { return err } // Terminate each value with a newline. // This makes the output look a little nicer // when debugging, and some kind of space // is required if the encoded value was a number, // so that the reader knows there aren't more // digits coming. e.WriteByte('n') b := e.Bytes() if enc.indentPrefix != "" || enc.indentValue != "" { if enc.indentBuf == nil { enc.indentBuf = new(bytes.Buffer) } enc.indentBuf.Reset() err = Indent(enc.indentBuf, b, enc.indentPrefix, enc.indentValue) if err != nil { return err } b = enc.indentBuf.Bytes() } if _, err = enc.w.Write(b); err != nil { enc.err = err } encodeStatePool.Put(e) return err}Encode方法通过encodeState的marshal方法进行序列化,这里它读取了enc.escapeHTML选项
推荐阅读
-
俄罗斯|全球公认“美女国”,美女个个都拥有“蚂蚁腰”,被称为“腰精”
-
遥享健身|是好习惯吗?看看你有没有这几个错误习惯,你的健身习惯
-
凯翼|起亚的王牌SUV亮相!标配四驱,搭3.8L动力,若国产必火
-
暴雪|暴雪深陷“骚扰门”!消息称《守望先锋2》2022年发售无望
-
-
中华小神兵|如今毫不犹豫对美妥协,放弃中国转向日本,曾是中国亲密好友
-
你的温暖|| 百日行动,导航延时,他做出这惊人的操作……
-
快资讯|五个字符拒绝了那英的沈腾《夏洛特烦恼》!其中“大碗”
-
科技壹零扒 猛牌音响近五十年品牌精髓呈现,回顾丨成都国际音响展热度最高的展厅之一
-
-
卡尔赫林 | 人类探索火星,真正目的是什么?,2020火星元年
-
挖贝网|金刚线产品订单有所增长,三超新材2020年上半年预计净利1200万至1400万
-
民间|民间说“狗肉上不了宴席”,为何还有那么多人吃狗肉?原因有很多
-
-
成都西凡视觉|备婚全攻略|伴娘可以是自己亲妹妹吗 姐姐结婚妹妹可以当伴娘吗
-
小井聊美食夏天,番茄和它是绝配,做法新颖简单,口感脆爽,还特下饭
-
|KITH x AF1 全新配色曝光!阴阳设计 + 渐变 Logo 太吸睛
-
-
-
电饭锅内胆放煤气灶煮会有毒吗 电饭锅内胆有毒吃了致癌