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()) }}
推荐阅读
-
新华社|新增100万病例仅用15天,综述:美国单日新增新冠病例再破7万
-
农村户口买房原来可以拿到十万的补贴!这些新规定你了解吗?
-
四大天王|网友:没名气、没作品,黎明凭什么入选“四大天王”?
-
我饿吗vivo:效果炸裂,都是原相机拍照,华为和苹果在预料之中,看到
-
5G发布后,4G变慢,电信高管道出实情,你的4G还能用多久?
-
源青柏|紧身裤浓而不俗,彰显优雅气息,老女人要对自己好点
-
日本|日本搞了个没有二次元的cosplay大会 反倒更火了
-
伊朗外长突访G7举办地 法国充当调停人呼吁美伊对话
-
[室内健身]每日必练:12个最经典的室内健身动作!
-
上海瑞金医院胸外科▲机器人手术大显身手,「瑞金胸外」食管良性肿瘤不用愁
-
科技生活快报|俄航天集团确认美国宇航局发布进步号飞船高速飞行的计划
-
杰出世界|全长仅117公里,却不断被毁不断修建,厉害!我国非常难修的公路
-
解放双耳,畅享舒适自由---韶音 AS660骨传导耳机
-
水瓶座|沉得住气,不走捷径的星座,肯吃苦,愿意走远路,属于长期主义者
-
【高考】当疫情遇上合一“十八线主播”,教育故事就此展开……
-
科技老于 处理器?,小米4820mAh新机曝光,首发骁龙750G
-
-
娱乐家常菜|Z1全新到来,618火爆各大平台,幻影流星iQOO
-
-
动作学院|高效减脂、促进肌肉健康的自重训练,该如何进阶?