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()) }}
推荐阅读
-
摩羯座|11月上旬,遇到真爱之前,这4大星座依然会保持单身
-
帽子戏法|踢疯了!6-0横扫!英超9.1豪门踢爆弱旅,8100万球星帽子戏法
-
脸上毛孔粗怎么办,简单收缩毛孔方法,脸上毛孔粗大怎么办收缩毛孔有方法-
-
车评视角|又一合资中型SUV来袭,颜值高配置壕油耗6.9L,先别着急买CR-V
-
程序员:百度女程序员半夜打的回家,被的哥嘲讽:加班到一点收入还不如我,图啥?
-
还未交房,发现外墙渗水,问题严重吗是不是有必要退房
-
-
黔东南二三里|广东骑行爱好者贵州三都遇事故 交警妥善处置获点赞
-
论文作者谈14.7%的猫感染新冠病毒仅限高风险样本:碧桂园手握现金2683.5亿应对周期,权益回款率达96%
-
『快节奏』深圳草铺铁路公园,在快节奏闻名的城市,是时光沉淀下来的艺术品
-
-
真·三国无双|光荣发布中文字幕版《真三国无双8:帝国》介绍视频
-
-
「猛犸漯河」新冠可以轻松自愈的想法太误导人,纽约州长弟弟:我3天掉了12斤
-
-
口红|张子枫上热搜,把网友的“假自由真双标”,撕了个稀碎
-
苹果|网友给卢伟冰的一句留言上热评:希望Redmi K60加入灵动岛
-
-
-