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()) }}
推荐阅读
-
#cnBeta#微软取消原定于3月在墨尔本举行的IoT in Action大会,受疫情影响
-
-
那些双胞胎甚至三胞胎、多胞胎一样的茶,让我眼花缭乱
-
-
陨石|陨石坠落现场!一颗流星划破长空,北欧三国夜空亮如白昼
-
诈骗|假称出租房屋代为配置家电,骗走业主数十万用于还债,1人已落网
-
2022我的新年愿望创意句子文案 2022我的新年愿望创意句子文案怎么写
-
亚太日报■自称不能给伴侣过生日难过,杜特尔特怒批隔离令下有人喝酒斗鸡
-
#科技数码迷#11夺冠荣耀V30Pro垫底,本周最畅销单品分析,iPhone
-
-
消化疾病|肝脏是否健康?看手脚4处变化,若你全占,或肝脏已经“垮”了
-
加速器|多部门密集部署政策 消费复苏“加速器”启动
-
【车家号】本田又一中型SUV亮相,搭3.5升V6发动机+四驱系统!,对标汉兰达
-
-
|进球网: 梅西中止续约谈判是为表达不满 巴托梅乌面临提前卸任
-
-
-
主动|果然“炒股不如买基金”!指数跌超40%,股基竟然翻倍赚!前3季度、近3年和5年最赚钱基金50强来了!
-
快了棒棒糖|展现疫情笼罩下的美国,美国时代周刊又一封面
-