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选项
推荐阅读
-
乐居网▲连续两年下滑,禹洲地产:2019年毛利下降18.4%
-
生活过得没盼头,对未来很迷茫,22岁青年应该怎样走出现状。
-
-
|?简历从官网撤下!成都女副区长“不雅聊天”这事,两个家庭最受伤
-
南海热带低压已生成 15日至20日海南岛将有强降雨
-
「利率」房贷一族注意了,算法要变!手把手教您计算方式!
-
-
『5G』“5G+”横空出世,这些票迎来布局机会!(附股名单)
-
小屁孩儿|帮助娃恢复好胃口,宝宝进入“厌奶期”怎么办?宝妈做到这几点
-
宝妈读吖|母亲骂她多事,3天后发现蹊跷,13岁女孩每天半夜偷偷“洗衣服”
-
徐艺洋|25岁女星徐艺洋深夜陪老板!两人穿着低调似情侣,曾多次否认恋情
-
魔兽世界|魔兽世界:怀旧服已开放仇恨接口,战士技能“仇恨理论”重新洗牌
-
-
-
逆水寒|逆水寒新职业实机破播放纪录,玩家:都是老头环和刺客信条粉丝
-
文物收藏|男子买到嘉靖青花瓷罐,拿去参加鉴宝节目,专家说价格不是最重要
-
-
-
-