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选项
推荐阅读
-
股价|疫苗研发哪家强?中国疫苗正挽救巴西阿联酋,美国疫苗还在割韭菜
-
|回国才发现中美防疫天差地别,让女儿逃离武汉的美国父母
-
-
「果粉之家0」iPhone将更加便捷~,苹果正在开发NFC功能
-
#林黛玉#红楼梦:林黛玉的病为何越治越差?王夫人为她治病的方式让人起疑
-
从未走开|再穷不能穷珠宝,这个国家的人民最爱珠宝首饰,加工工艺很精湛!
-
南非总统发表致南非妇女公开信:促就业,实现经济独立
-
胡八一|放心了,剧情不畏尺度,这部《鬼吹灯》新作,拍出了国产剧的底气
-
好看的人啊啊啊:新的支付方式已在全国兴起,马云没吹牛!扫码支付终将退出舞台
-
-
30万想买豪华SUV?冒险家“豪华静谧”,还有超长质保
-
北斗观察者|飞行8000多公里,发射导弹精准命中目标,2架战略轰炸机紧急出动
-
「儿时动漫」玉帝大怒:都怨太白,感冒灵一点用也没有!,玉帝又感冒了
-
-
-
乐游上海|市文旅局推荐的“发现沪郊好去处” 精品线路,你去过几条?
-
走出“一亩三分地”开辟融合试验田——从天津滨海—中关村科技园
-
-
「北京国安」来新人了!国安重新吹响备战集结号,四大王牌新星首次现身一线队
-
健康正确的睡姿有利大脑代谢?不仅如此,还可预防老年痴呆!看你是吗