Any方法会根据value的类型返回不同的Field,如果value没有实现zapcore.ObjectMarshaler、zapcore.ArrayMarshaler,也不是基础类型,则走的是默认的Reflect(key, val)
Reflectzap@v1.16.0/field.go
func Reflect(key string, val interface{}) Field { return Field{Key: key, Type: zapcore.ReflectType, Interface: val}}Reflect创建的Field类型的Type为zapcore.ReflectType
AddTozap@v1.16.0/zapcore/field.go
func (f Field) AddTo(enc ObjectEncoder) { var err error switch f.Type { case ArrayMarshalerType: err = enc.AddArray(f.Key, f.Interface.(ArrayMarshaler)) case ObjectMarshalerType: err = enc.AddObject(f.Key, f.Interface.(ObjectMarshaler)) case BinaryType: enc.AddBinary(f.Key, f.Interface.([]byte)) case BoolType: enc.AddBool(f.Key, f.Integer == 1) case ByteStringType: enc.AddByteString(f.Key, f.Interface.([]byte)) case Complex128Type: enc.AddComplex128(f.Key, f.Interface.(complex128)) case Complex64Type: enc.AddComplex64(f.Key, f.Interface.(complex64)) case DurationType: enc.AddDuration(f.Key, time.Duration(f.Integer)) case Float64Type: enc.AddFloat64(f.Key, math.Float64frombits(uint64(f.Integer))) case Float32Type: enc.AddFloat32(f.Key, math.Float32frombits(uint32(f.Integer))) case Int64Type: enc.AddInt64(f.Key, f.Integer) case Int32Type: enc.AddInt32(f.Key, int32(f.Integer)) case Int16Type: enc.AddInt16(f.Key, int16(f.Integer)) case Int8Type: enc.AddInt8(f.Key, int8(f.Integer)) case StringType: enc.AddString(f.Key, f.String) case TimeType: if f.Interface != nil { enc.AddTime(f.Key, time.Unix(0, f.Integer).In(f.Interface.(*time.Location))) } else { // Fall back to UTC if location is nil. enc.AddTime(f.Key, time.Unix(0, f.Integer)) } case TimeFullType: enc.AddTime(f.Key, f.Interface.(time.Time)) case Uint64Type: enc.AddUint64(f.Key, uint64(f.Integer)) case Uint32Type: enc.AddUint32(f.Key, uint32(f.Integer)) case Uint16Type: enc.AddUint16(f.Key, uint16(f.Integer)) case Uint8Type: enc.AddUint8(f.Key, uint8(f.Integer)) case UintptrType: enc.AddUintptr(f.Key, uintptr(f.Integer)) case ReflectType: err = enc.AddReflected(f.Key, f.Interface) case NamespaceType: enc.OpenNamespace(f.Key) case StringerType: err = encodeStringer(f.Key, f.Interface, enc) case ErrorType: encodeError(f.Key, f.Interface.(error), enc) case SkipType: break default: panic(fmt.Sprintf("unknown field type: %v", f)) } if err != nil { enc.AddString(fmt.Sprintf("%sError", f.Key), err.Error()) }}
推荐阅读
-
法制日报|部分企业利用95号段从事网络诈骗,工信部全网排查!
-
-
青年|13岁初中生花100元买V1钻石号,本以为亏了,看到1皮肤直接笑晕
-
-
高尔夫两厢自动挡报价-2013年12月购买起亚k2两厢1.4排量顶配二手车价
-
信用卡|卡奴苦日子来临?银行“动真格”了,有此类行为将被“严惩”!
-
美食植物肉比较健康?来看看营养师告诉你,背后的真相!
-
中国家电网■谁来保障舒适沐浴体验?总有一款热水器符合您的心理预期
-
-
-
-
云食间|吃面吃饭来一勺,立马好吃几倍,放一星期都不坏,夏天我家常备它
-
幽默搞笑段子集锦|不到一年就挣了100万,幽默笑话:老丈人天天泡在麻将馆
-
尤娜娜时尚手册|“土鳖”腰包成功逆袭,成为时下超in的包包,连赵薇、韩雪都在挂
-
杭州00后小伙沉迷剧本杀入戏太深,半夜大喊大叫!母亲崩溃
-
展示美女|白衬衫配蓝瑜伽裤,舒适贴身,充满运动气息
-
-
-
白领保健养生▲白领该如何保健养生?4种水果巧对白领职业病
-
快乐育儿分享|提醒各位家长:这3件事少做,养护孩子脾胃,孩子积食会有5种表现