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()) }}
推荐阅读
-
-
热剧天天乐■俄罗斯45吨,美国34吨,我们是多少?,各国轰炸机载弹量
-
-
-
小米|799元 米粉试用小米旗舰降噪耳机FlipBuds Pro几分钟就剁手
-
美的“轻净之夜II”传播不走寻常路,别样发布会轻盈出圈
-
中年|王者:打坦克最快的几个射手,狄仁杰只能第2,最后一个堪称坦克噩梦
-
-
停电■世界上“最怕停电”小镇:深埋地下120米,暗无天日却居住3400人
-
杨幂:凭什么要别人了解你的辛苦|你身边有这样的人吗?杨幂:凭什么要别人了解你的辛苦 不卖惨人设
-
|“跟女朋友视频看到这个,她身上长的这是什么?”哈哈哈哈哈...不懂也好!
-
-
同安区水之新公司简介,专业吗?厦门水之新环保科技有限公司
-
「4月中旬起分5个批次组织师生」辽宁:4月中旬起分5个批次组织师生返校复学
-
-
甜味超标|《最强大脑》决赛考验的是手速和基础,这种赛制,水哥来了都不行
-
南海网|海南周刊 | 黎婺山——五指山——鹦哥岭 黎母岭今古钩沉
-
行业互联网|温尼伯独立媒体经济咨询公司研究 加拿大百家媒体将倒闭
-
-
寒夜|寒夜爆料,冠军杯决赛将有“神秘战队”发布环节,KPL将有新的战队加入?