一、问题背景
针对 runtime.Extention 字段,采用 “k8s.io/apimachinery/pkg/util/yaml” NewYAMLOrJSONDecoder.Decode → “gopkg.in/yaml.v3” yaml.marshal → “k8s.io/apimachinery/pkg/util/yaml” NewYAMLOrJSONDecoder.Decode 的形式走不通
check_sum 为 runtime.Extension 结构体,采用 yaml.Unmarshal 会丢失该字段的值
因此原先的实现是通过 k8s.io/apimachinery 库函数的 NewYAMLOrJSONDecoder.Decode 方法把上图的 check_sum 结构 unmarshal 到 runtime.Extension 的 Raw []byte 数组,将该 byte 数组转化为 string 为
但由于没有找到 NewYAMLOrJSONDecoder.Decode 对应的 encode 方法,采用 yaml.marshal 的话,会变成这类形式:
再对上述结构 采用 k8s.io/apimachinery 库函数的 NewYAMLOrJSONDecoder.Decode 方法 unmarshal 成 algometa,对应的 byte 数组转化成 string 变成了这个形式,
出现了数据的错误
解决方法:
使用 k8s.io/apimachinery NewYAMLOrJSONDecoder.Decode 和 “sigs.k8s.io/yaml” 的 marshal 方法
或者更改 runtime.Extention 结构体为 map
教训:
不要 decode 方法就非得对应 encode 方法,找找 marshal 方法;翻翻源代码或者别人的仓库是怎么使用的来看怎么 marshal