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()) }}
推荐阅读
-
-
穿搭|张予曦的身材亮了,坐下来的腰没有一丝赘肉,不愧是王公子的前任
-
-
米尔|印度豪购30架无人机,单价堪比五代机,不差钱买买买
-
中国企业报|「园区」从“引资”到“选资”这样打通园区招商痛点
-
辽沈晚报抚顺时刻|抚顺市新抚区美食嘉年华来啦!“逛吃”模式已开启
-
哔哩哔哩十大好看动漫推荐,bilibili里面好看的动漫推荐-
-
『华为』华为被美国“制裁”,为什么任正非一点不慌?郭台铭:也不看看是谁在撑腰!
-
「汽车维修人」符合这5个条件的车主,一分都不赔,总算搞懂“交强险”
-
「王不装」工作人员穿搭则是另一种风格,24岁林允穿搭“学生风”很减龄
-
火星|好奇号从火星传回自拍照,画面清晰,看到的火星是这样的
-
老年人健康|五十岁后,人生将遇寿命坎,凡是能跨过去,寿命将有保证
-
时间要闻|男子10万雇凶杀"母","杀手"临阵心虚,挥手竟"拦"下辆警车
-
-
女儿别怕,妈妈来了!听说女儿女婿吵架,90岁阿婆步行50公里“撑
-
大建侃球下周联盟就会给出复赛答复,巴克利百分百确信NBA会重启
-
教育圈|湖南女子学院社会学学科建设持续发力,强化校企合作
-
-
焦糖老干妈|为什么有人喜欢有人说丑?审美层次最枢纽,同样“极简风格穿搭”
-
【光刻机】国产光刻机再次“破冰”,张忠谋的话惨遭打脸?美科技界始料未及