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选项
推荐阅读
-
大众报业·海报新闻|财鑫闻丨万亿成交量重现,“牛市旗手”集体飘红!机构:关注两条主线
-
新华网|我国成功为法国可控热核聚变大科学装置研制核心部件
-
温情|《乔乔的异想世界》暖心治愈,用温情揭露残酷战争
-
「鱼头」鱼头怎么做?大叔教你酱烧鱼头,酱香浓郁,鲜香味美,超好吃!
-
四川法制网|峨眉市场监管局迅速排查,聚焦“3·15”晚会曝光黑心毛巾问题
-
曹作兰艺术行走|街拍:浴室拖鞋美女,穿出“不装”之美
-
读职场|如今可能要提前了, 美国已“焦头烂额”,10年后中国GDP将超越美国?
-
-
黑猫的厨房TB看完太酸了,网友:分餐合理,值得参考,80后日本妈妈分享早餐
-
@别傻了,这几个紫砂壶造型,在如今的紫砂市场基本买不到全手工!
-
-
-
-
十二星座大宝典思念任未断,旧情势在复合的星座,5天后
-
历史每日揭秘|谁注意身后的张含韵在干嘛?也太随心所欲了,孟佳辅助团队舞蹈时
-
吉利|连当4年国产车销冠!吉利汽车5月销量出炉:同比环比双降
-
-
鲁能|新华社点名马宁,京鲁大战争议终于有权威声音,足协会有何回应?
-
爱牙说 想要预防和治疗孩子牙齿不齐?这些方法家长不容错过
-