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车烧毁1车部分损毁,鄂州兄弟因赡养老人起争执
-
幸褔平淡共存|雄鹿即将进行大交易?名记透露1人成为筹码,字母哥未来基本确定
-
美国|美国首现二次感染病例丨全球疫情20条最新信息
-
宋朝注重军事理论研究的主要表现?宋代在教育方面有何成就
-
央视新闻客户端|2020年上半年经济数据出炉 19个省份GDP超一万亿元
-
-
「汽车大咖」一汽-大众探影是款物美价廉的精品SUV!,11.49-15.99万元
-
预计今天夜间北京空气质量为中度污染 11日上午空气质量改善
-
中新经纬|虚列费用、虚构中介业务套取费用,阳光财险支公司被罚25万
-
【H·坏先森】看看LOL克隆模式玩谁才更快乐?,克隆模式胜率榜一览
-
销售额|商场营业额两位数增长、夜经济火爆…… 浙江“双节”长假消费数据来了
-
[楼市新观]桃花入梦,旧情不改,渴望时间能倒流,再度缠绵走到一起,10天后
-
-
漫漫笑|你还拿去买包,你有没有考虑我的感受,幽默笑话:我就这么点钱了
-
举重|举重冠军邹春兰,因服役时吃“补药”终身不育,退役后当了搓澡工
-
-
-
-
|结合无果的小蝌蚪,最后的“归宿”是哪里?女性都很好奇前3种