Golang json 序列化
前言
这两天升级 client-go 版本,涉及 grpc proto 相关代码生成。升级完成后在调试的过程中,发现当数据存入etcd时,一个boolean类型的字段消失了,仔细研究了相关代码半天,最后才发现 go 在 Marshal 结构体时,如果字段是boolean类型,并且设置了omitempty,则会在false的事后作为empty删除。为了避免以后再次栽倒同样的坑里,特意写作本篇博客详细记录golang对json的处理。
这两天升级 client-go 版本,涉及 grpc proto 相关代码生成。升级完成后在调试的过程中,发现当数据存入etcd时,一个boolean类型的字段消失了,仔细研究了相关代码半天,最后才发现 go 在 Marshal 结构体时,如果字段是boolean类型,并且设置了omitempty,则会在false的事后作为empty删除。为了避免以后再次栽倒同样的坑里,特意写作本篇博客详细记录golang对json的处理。
除了 default-gen
, deepcopy-gen
, conversion-gen
, 和 openapi-gen
外,还有其他的生成器:
go-to-protobuf
client-gen
lister-gen
informer-gen
codecgen
(使用 ugorji codec快速串行化json)大部分生成器基于 gengo ,拥有相同的命令行选项。 --verify-only
会检查磁盘上的将要生成的文件。
生成器生成代码时有个 --go-header-file
选项,该选项指定包含生成代码头部内容的文件。头部内容一般是版权信息,放在生成代码的最前面,并且会被稍后的 repo-infra/verify/verify-boilerplane.sh 脚本检查。
执行 make update
会调用一系列脚本 包括以上的生成器。请继续阅读以下段落,因为某些生成器的使用需要一些先决条件,而且执行 make update
耗时太久,下面还会介绍如何单独调用生成器。
现在是时候开始介绍如何修改内部结构体,这样你修改的 versioned API 才能正常使用。
修改版本API是所有修改中最简单的,只需要开发者保持修改后的API相互兼容,比从头写要一个新的 rest API 更容易。
本文宏观介绍 kubernetes 的 API 各版本之间的联系以及 API 开发的原则。