聊聊golang的zap的ReflectType( 四 )


实例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】


推荐阅读