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选项
推荐阅读
-
-
Win10系统怎么无线投屏?win10无线投屏怎么操作
-
律师|樊小慧近况曝光,知情人透露:爱心人士帮忙请了律师和心理医生
-
车迷之行|几个细节很重要,如何看一个人驾驶技术如何?别看车技和驾龄
-
山东新增菲律宾输入确诊病例3例,均由无症状感染者转归
-
澎湃新闻|总统御衣、美式西装鼻祖Brooks Brotherss缘何走向“终结”
-
Intel|12代酷睿i5/i7/i9规格偷跑:最高16核、多线程性能提升两倍
-
明星照片|THE9聚会生图来了,像极了职场饭局,孔雪儿看了这张不会生气吗?
-
[小品科技]直男们别在说“多喝白开水”,小米有品新神器左点智能暖灸宝
-
【曹向阳黄金分析师】多方延伸再看1738,曹向阳:黄金转涨及时跟进
-
-
少年白马醉春风|剧版《少年白马醉春风》开启,四大主演人选爆出,堪称本色出演
-
手遊达人|王者荣耀:射手在团战中有多少细节?三角走位可能玩家都没听说过
-
-
星轨的蓝色眼泪|理财能力也出色的星座,吸金能力超强,令人羡慕,赚钱能力出众
-
-
深读|平安创投张江:注册制后一二级市场估值靠拢 投资更专业
-
|男生长期“滴酒不沾”有啥后果?身体是不会骗人的,说出来别不信
-
-