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()) }}
推荐阅读
-
肆客足球|博格巴双手击球送点,曼联1-1西汉姆联升至第三
-
奇瑞瑞虎@奇瑞全新“战神”来袭!比丰田威兰达帅气,1.5T+四轮独悬,7.99W
-
NG视频|你是“骨相美”仍是“皮相美”,看清楚这5点,轻松辨别清晰
-
MIUI|MIUI 8月份有重要调整:解决发烧友吐槽的内测机制问题
-
-
『朱军』朱军现身钓鱼场,轻松上鱼、技法娴熟,网友:这水真黑!
-
-
深圳女网红,8年花800万整成范冰冰,嫁给主刀医生,后来怎么样了
-
-
求职|女生网上吐槽:应届毕业生求职陷入纠结,是选择生存还是面子?
-
新华社|新华财经|工信部闻库:形成以建促用的5G良性发展模式
-
湘湘带你看社会|罗田县民政局组织开展全县养老机构安全生产大检查
-
-
北青网综合|强对流天气蓝色预警:我国这些地方有雷暴大风或冰雹
-
闲情居|数字化转型具体落地有着落,超自动化开启RPA红利时代
-
-
亦记得|郭麒麟被问喜欢哪位歌手?他说出的答案。让范丞丞直呼受不了
-
牛肉做粉蒸,简单好做,省时省力,原汁原味还鲜嫩可口
-
-
忠橙12号|巩晓彬用好4人就有戏,39岁老将不想就此退役,齐鲁德比来了