实例type User struct { Name string Email string CreatedAt time.Time}type Users []*Userfunc reflectTypeDemo() { logger, err := zap.NewProduction() defer logger.Sync() if err != nil { panic(err) } var user = &User{ Name: "hello1", Email: "hello1@test.com", CreatedAt: time.Date(2020, 12, 19, 8, 0, 0, 0, time.UTC), } var users Users users = append(users, &User{ Name: "hello2", Email: "hello2@test.com", CreatedAt: time.Date(2020, 12, 19, 9, 0, 0, 0, time.UTC), }, &User{ Name: "hello3", Email: "hello3@test.com", CreatedAt: time.Date(2020, 12, 20, 10, 0, 0, 0, time.UTC), }) logger.Sugar().Infow("hello", "user", user, "users", users)}
输出
{"level":"info","ts":1608350874.177944,"caller":"zap/zap_demo.go:42","msg":"hello","user":{"Name":"hello1","Email":"hello1@test.com","CreatedAt":"2020-12-19T08:00:00Z"},"users":[{"Name":"hello2","Email":"hello2@test.com","CreatedAt":"2020-12-19T09:00:00Z"},{"Name":"hello3","Email":"hello3@test.com","CreatedAt":"2020-12-20T10:00:00Z"}]}
小结zap的sugar提供Infow方法,它通过sweetenFields方法来将key,value封装为Field;sweetenFields方法使用的是Any方法,它会根据value的类型返回不同的Field,如果value没有实现zapcore.ObjectMarshaler、zapcore.ArrayMarshaler,也不是基础类型,则走的是默认的Reflect(key, val);AddTo方法根据Field的类型做不同处理,如果是ReflectType类型,则执行的是enc.AddReflected(f.Key, f.Interface);jsonEncoder的AddReflected方法使用golang内置的json.Encoder来序列化 。
doc
- zap
【聊聊golang的zap的ReflectType】
推荐阅读
- 富春山居图是中国十大传名画之一这幅画的作者是 富春山居图是中国十大传世名画之一这幅画的作者是什么
- 端午节又称什么 端午节的别称分别是什么
- 提高微服务安全性的11个方法
- 绿茶的保质期,红茶的保质期
- 8款药膳花茶,茶药膳疗法对保健起着不可忽视的作用
- 白福鼎老白茶价格,白茶的价格
- 老公眼里觉得你很“贱”的7个举动
- 男人不同时期想要的女人
- 女人单身太久的十大负面表现
- 女人硬起来其实比男人的还硬