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选项
推荐阅读
-
「新发地」水果均价同比降了近7%,新发地蔬果日上市量均超2万吨
-
-
顾客|家庭聚餐基本“吃多少点多少” 有剩菜还会主动打包
-
防疫狙击战中大显身手,百度地图迁徙大数据平台“加速出击”
-
-
【武磊】武磊崩溃!空门良机队友却不传球,他无奈瘫倒地上,解说连喊四个莫名其妙
-
个股|最新出炉!8月4日沪深股通净流入21.37亿,其中近8亿买了贵州茅台
-
-
『图片中国』3降价 跌入政策补贴范围内,特斯拉Model
-
较量:逼美军无奈停产吗?误解,刚下令搞升级了,战斧式被俄军拿去研究
-
金莎回应盛况在夜店和女子接吻:谈恋爱是为了支撑我的事业!
-
【功能】大招“影分身”:小米10青春版这个功能有点意思
-
2019国内安全奶粉排行榜出炉,君乐宝用安全的品质筑起孩子的未来
-
环球网|美国女子慢跑时在路边看到腐烂人头 警方:正调查
-
星座范|真情不会老,陪你到白头,最适合久伴的三大星座
-
环球网|乘客惊慌尖叫!伊朗客机遭美F15战机“侵扰”迫降
-
斯斯娱|《以家人之名》只知道张新成宋威龙?其实两位爸爸才是真男神
-
-
网罗说科技|鸿蒙OS+麒麟9000+双5000万,售价很感人,荣耀V40pro秀肌肉
-