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选项
推荐阅读
-
深圳|在深圳,这活动每年超百万人参与,到底是个啥?
-
-
再次刷新纪录!我国快递年业务量首次突破800亿件 连续7年居世界第一
-
娱记小江@多做3个小动作,不烂根生根快,成活率提高2倍,4月给多肉上盆
-
第一名|“96885吉人在线”创新就业服务新模式,破解就业难、招工难、引才难
-
-
-
威尔·史密斯▲曾和成龙一起拍电影的史密斯儿子, 如今长残, 眉毛头发染成怪物
-
剧情|润东汽车上演庞大“剧情”:出售多家4S店未能自救 面临破产重组因扩张过快?
-
-
甄嬛传|重温《甄嬛传》才发现:欣贵人为了揭开祺嫔真面目,下了一盘大棋
-
建行|女子莫名在建行背上4000万贷款担保,银行到底是怎么“搞错”的?
-
『幽默搞笑段子集锦』被抛弃后甚是郁闷,整日郁郁寡欢,幽默笑话:室友的女友劈腿
-
-
-
野马游戏|热血传奇:武器战士才能用?谁说的,第一个用“小屠龙”的道士
-
国际丨日媒:菅义伟获自民党过半数支持 大佬集体背书或因为安倍
-
鬼马时尚精|短发造型有点显老,看着少了灵气感,金铭长大后真是变了不少
-
沈阳5个孩子下河玩耍3人溺亡|沈阳5个孩子下河玩耍3人溺亡 究竟怎么回事?
-