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()) }}
推荐阅读
-
babybaiuu 不是有钱就能具备!做到这4点,土妞也能很精致,想有高级贵妇感
-
有多少身上长了火疖子,个头特别大,而且还伴随发烧的,我就想知道是不是只有我遭遇了史上最猛的疖子
-
-
网通社汽车频道|或明年下半年亮相,通用汽车规划商用电动货车
-
欧联网|民防部再发预警,意大利北部遭恶劣天气重创致8死
-
南昌今天又多一条商业街 青云谱区洪都夜巷文化商业街区开街
-
罗罗聊数码华为两款备用机,999起5000毫安512G拓展,4800万OLED屏
-
-
江女士|肌肤松弛?毛孔粗大?不存在的,3支,就能还你一张少女颜
-
-
武汉琴台大剧院9月开启金秋演出季 精品剧目轮番上演
-
历史纷纷评|瞪长兄一眼就要杖打八十,古代的忤逆之罪有多严重犯则非死即伤
-
|横厅越来越受欢迎,125㎡装修从简,干净清爽住着很舒适
-
净利润|八成产品出口到中国,还想趁机涨价,但中国却不能不买!
-
-
糗大了!关之琳穿金戴银臭美,裤门大开拉链没拉,60岁仍单身
-
[图说武器装备]土方遭遇欺骗,一对一损失太大,气体装甲车出现在叙战场上
-
『科技日报』利用AI技术,滴血验癌可提前发现五十多种癌症
-
影圈堂叔|“纸片人”逆袭!赵丽颖浑身肌肉男友力十足,杨幂好身材算啥,
-