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选项
推荐阅读
-
-
-
科技説説説|从高端市场跌到中端市场,网友:终于等到了!,从5488降至3428
-
-
第一次提问:我住在大学6人宿舍,我把自己的小地方好好按照我的方式收拾了一次,舍友有些不认可,咋办
-
娱乐圈快看|小露香肩秀完美侧颜,五官精致宛如芭比娃娃,Baby拍时尚大片
-
人到中年越没钱,越不要深交这三种小人,小人只会背叛你,利用你
-
「」上网课,学生的家境被“一览无余”,网友:没有对比就没有伤害
-
地球|印度将成人口第一大国 红利还是陷阱?近17亿人口 风险和压力激增
-
「」为啥强悍如老鹰都不敢碰喜鹊?老鹰:不是不想碰,躲都来不及
-
-
【移动支付】马云也没料到!支付宝不知不觉中,摧毁了一个存在千年之久的行业
-
股票|江南化工:拟发行股份购买北方特种能源集团所持的民用爆破业务子公司股权
-
-
国际狗仔■地铁内人员大量聚集,俄罗斯电子通行证审查首日状况:交通拥堵
-
第一财经|一文读懂公募REITs业务配套文件说了什么
-
中国|无道失德 千夫所指——看清美“三无”政客真面目系列评论之三
-
游侠网|预计9月17日发货,魔兽桌游《小小魔兽世界》开启预购
-
二狗聊科技▲江淮玩起能量转化物尽其用,汽车尾气=电能?
-