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()) }}
推荐阅读
-
龙丹妮手中最大一张牌,美国豪宅堪比博物馆,国内老家还有瞭望塔
-
ZAKER|未来2年内开建!,34.3GW平价风电项目
-
-
晚安曲推荐|著名导演邀请吴彦祖,欲拍《赌王传》,遭何超仪大骂有违道德,原创
-
光明网|重温抗日战争伟大历史《海报里的英雄》开播在即
-
-
-
-
扎哈维|重磅!富力对一线队名单进行了重大调整,金靴射手被正式撤出名单
-
陈晓|古装帅哥热度榜:肖战第一、胡歌第五、王一博第八,王鹤棣落榜
-
如果一个人从小到大只获得正向反馈(想要的都得到,想做的都成功),他是否能获得「反思」的能力?
-
鹏飞奇闻变得年轻漂亮,关键秘诀就藏在我们的细胞里,想要延年益寿
-
-
冰封千里266|要买电视的朋友了,可以仔细看我的文章,双11要来了
-
-
品恒星语|您的“贵人”已到家中,别让他们失望!,属羊人:快行动起来
-
电影|漫威和DC联动 滚导想拍小丑女和格鲁特电影?本人回应
-
-
「龙江六道尖」但拿手机的方式代表了一个人性格,看看你属于哪方面,手机普遍了
-
『央视财经』跌幅1.06%;央视50指数报6888.00点,跌幅0.82%,收盘:沪指报2808.53点