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选项
推荐阅读
-
穿透心灵的冰|欧阳娜娜做客《向往4》,张子枫迎接姿势太抢眼,关系好坏很显然
-
翡翠|世界最“珍贵”的河,里面的东西比黄金还贵,24小时有军队看守!
-
家居|汇森家居三度闯关港交所:业绩增长放缓客户集中存风险
-
荣威RX5|13万左右,国产SUV怎么选?网友追捧的是这3款车
-
『神鸟知讯资讯站』台湾大妈组20人团欧洲游,委屈:有人恐吓叫我去死,欧洲疫情汹涌
-
-
-
北京日报客户端|同时面临秋冬流感季压力,世卫:部分国家新冠疫情堪忧
-
為什麼來澳門讀書的國內學生大部分都選科技大學而不是澳門大學呢
-
白鲸瞭望台|用军事竞赛拖垮俄罗斯?,特朗普又要退群!解除限制恢复核试验
-
手机大魔王天玑820发布,和麒麟985并肩跑到41万分,原来处理器还是国产的好
-
-
勇哥科技 22.5W快充到底够不够用?荣耀X10实测告诉你
-
-
G时尚|孙怡身穿简洁白衬衫搭配条纹西裤,一身利落大气的造型穿搭
-
小暖妈妈说|有4种毛病,家长不要心软该打就打,6岁之前的孩子就要立规矩
-
-
韩信最终被刘邦所杀并夷灭三族 刘邦后悔杀了韩信么?
-
-
[外交部回应永兴岛部署战斗机]外交部回应永兴岛部署战斗机:这是主权范围内的事