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选项
推荐阅读
-
有多少身上长了火疖子,个头特别大,而且还伴随发烧的,我就想知道是不是只有我遭遇了史上最猛的疖子
-
『科技日报』利用AI技术,滴血验癌可提前发现五十多种癌症
-
|横厅越来越受欢迎,125㎡装修从简,干净清爽住着很舒适
-
罗罗聊数码华为两款备用机,999起5000毫安512G拓展,4800万OLED屏
-
网通社汽车频道|或明年下半年亮相,通用汽车规划商用电动货车
-
净利润|八成产品出口到中国,还想趁机涨价,但中国却不能不买!
-
-
糗大了!关之琳穿金戴银臭美,裤门大开拉链没拉,60岁仍单身
-
欧联网|民防部再发预警,意大利北部遭恶劣天气重创致8死
-
[图说武器装备]土方遭遇欺骗,一对一损失太大,气体装甲车出现在叙战场上
-
江女士|肌肤松弛?毛孔粗大?不存在的,3支,就能还你一张少女颜
-
影圈堂叔|“纸片人”逆袭!赵丽颖浑身肌肉男友力十足,杨幂好身材算啥,
-
南昌今天又多一条商业街 青云谱区洪都夜巷文化商业街区开街
-
babybaiuu 不是有钱就能具备!做到这4点,土妞也能很精致,想有高级贵妇感
-
历史纷纷评|瞪长兄一眼就要杖打八十,古代的忤逆之罪有多严重犯则非死即伤
-
-
-
-
-
武汉琴台大剧院9月开启金秋演出季 精品剧目轮番上演