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()) }}
推荐阅读
-
-
吖吖育儿|宝宝夏天更舒爽,宝宝能不能吹空调?父母做好这些工作
-
-
游戏早知道|Xbox One预购同步开启,《星球大战:战机中队》正式公布
-
-
1626潮流精选|| 夏天没有牛仔包,还叫夏天吗?,买物教室
-
北极以北|我却天天想着前妻,我该怎么办?,跟老婆结婚后
-
有趣探索|假设太阳突然消失,地球会发生什么变化?500秒后突然变化,原创
-
-
世界在右边|无缘NEST线下赛,「威客电竞LOL」IG一比二不敌VG
-
奶盖儿电竞说|赛后势力榜碾压众人排行第一,宝蓝苦练泰坦终于拿下MVP证明自己
-
美国钢铁|1987年时,美国钢铁产量超出中国2400万吨,现在差距怎样?
-
疫情|因疫情停工减产 美国备受欢迎的万圣节棉花糖缺货
-
|毛主席的妻兄,为暴动第一人,身经百战,七次负伤,建国后很低调
-
-
齐鲁网|高空坠落折叠刀直插男子后脑勺!网友:这不是没素质,这是故意杀人!
-
长江后浪推前浪下一句,长江后浪推前浪世上新人赶旧人是什么意思
-
《中国好声音》导演发声回应,态度嚣张遭网暴,本人再发声引争议
-
-
东方网|9个小时连夜突击 1400多辆公交车有了这款新“标识”