聊聊golang的zap的ReflectType( 三 )

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选项


推荐阅读