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()) }}
推荐阅读
-
俄罗斯|全球公认“美女国”,美女个个都拥有“蚂蚁腰”,被称为“腰精”
-
遥享健身|是好习惯吗?看看你有没有这几个错误习惯,你的健身习惯
-
凯翼|起亚的王牌SUV亮相!标配四驱,搭3.8L动力,若国产必火
-
暴雪|暴雪深陷“骚扰门”!消息称《守望先锋2》2022年发售无望
-
-
中华小神兵|如今毫不犹豫对美妥协,放弃中国转向日本,曾是中国亲密好友
-
你的温暖|| 百日行动,导航延时,他做出这惊人的操作……
-
快资讯|五个字符拒绝了那英的沈腾《夏洛特烦恼》!其中“大碗”
-
科技壹零扒 猛牌音响近五十年品牌精髓呈现,回顾丨成都国际音响展热度最高的展厅之一
-
-
卡尔赫林 | 人类探索火星,真正目的是什么?,2020火星元年
-
挖贝网|金刚线产品订单有所增长,三超新材2020年上半年预计净利1200万至1400万
-
民间|民间说“狗肉上不了宴席”,为何还有那么多人吃狗肉?原因有很多
-
-
成都西凡视觉|备婚全攻略|伴娘可以是自己亲妹妹吗 姐姐结婚妹妹可以当伴娘吗
-
小井聊美食夏天,番茄和它是绝配,做法新颖简单,口感脆爽,还特下饭
-
|KITH x AF1 全新配色曝光!阴阳设计 + 渐变 Logo 太吸睛
-
-
-
电饭锅内胆放煤气灶煮会有毒吗 电饭锅内胆有毒吃了致癌