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选项
推荐阅读
-
农村户口迁出后,留下的房屋和宅基地属于谁听听淳朴老农怎么说
-
青年|LGD横扫EDG:小花生找回巅峰状态 LGD或将成后半程黑马
-
-
阴阳师|阴阳师:辉夜姬损血机制遭迫害,1点鬼火损失5%生命,那么20点鬼火呢?
-
解放网|河南公布“专升本考试泄题”调查进展:培训机构非法从命题人员处获取信息,警方已立案
-
#厨师资讯TB#10道新颖家常菜品,不花俏,很实用
-
红魔西看台|巴萨铁血队长普约尔公开支持梅西离队:莱奥我佩服你的所作所为
-
-
-
菲汐布客时尚圈|天冷也要时髦营业,一件好看的外套演绎混搭风,温度风度统统都要
-
小儿健康|孩子消化不良了?家长应该做好这些事,或许能改善
-
-
-
-
「花卉网」这种花肥不能少,根壮叶绿花箭冒得勤,春养君子兰
-
-
乒乓王者:伊藤美诚助他第4次上奥运,他曾来中国学习技术!点张本智和接班
-
唐艺昕乘车出行,肚子隆起明显安全带系超松,被指像怀孕五六个月
-
「美国大选」“美国在台协会”前主席:中国很明智,没上特朗普当
-
香港知多D 12 将于10 月中发布?网传13 日亮相16 日开订,iPhone