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选项
推荐阅读
-
-
多多爱追剧|自律才能阻止油腻!,38岁韩寒消失43天后大变身:人到中年
-
『智能手机』许多人曾经用过的功能,可能真的要跟我们说再见了
-
百度|估值130亿!百度昆仑成立独立芯片公司 欧阳剑任CEO
-
[孙莉]24岁的黄磊为何一眼看中18岁的孙莉,看看孙莉青涩照,难怪黄磊下手这么快!
-
二次元木之本樱|三个人谁最强?实战与剧情结果不同第一,游戏打败过十代第二,游星承认游戏更强第三,幻神卡加持,游戏王:游戏、十代和游星
-
-
【汽车资讯|【事故首发】5月27日04:35G22青兰高速谗柳段事故处置进展】
-
-
星座人缘@桃花经久不衰,年纪越大越有女人味!,最让男人关注的3个生肖女
-
-
【微信】微信这个设置再不关闭,隐私可能就暴露了,别不当回事,快学学
-
尼安德特人:尼安德特人的复仇:和现代人祖先春风几度,给我们留下无尽祸根
-
-
逗得掉渣渣女神给我发了一张扮鬼脸的照片,是什么意思?,搞笑gif段子:
-
男性|男性各年龄段必做的体检项目,这篇文章全说清楚了
-
电竞撸圈老司机|CSGO一哥直播炫耀5万的游戏匕首?老婆听到后瞬间炸了
-
-
穿搭|15年前的宋慧乔,干练造型,乳白色针织衫温柔成邻家妹妹
-
勒布朗·詹姆斯:30队经理投票,现役最强5人组!自05年,詹姆斯首次落选