登录
首页 >  Golang >  Go问答

写出 YAML 格式的 Marshal 和使用 Client Go 处理资源

来源:stackoverflow

时间:2024-03-26 14:00:32 120浏览 收藏

在编写 Kubernetes 运算符时,作者遇到了使用客户端 Go 处理资源时的问题。作者定义了一个使用 `iota` 作为枚举的自定义类型,并尝试在编组状态 YAML 时使用该枚举的字符串表示形式。然而,客户端 Go 返回一个错误,表明枚举必须是整数类型。

问题内容

我正在用 crd 编写一个 k8s 运算符。该资源的状态字段的一部分是一个枚举值,使用 iota 如下所示:

type enum int

const (
    enum1 = iota + 1
    enum2
    enum3
    ...
)

我有一个附加到枚举的函数,可以将其转换为字符串表示形式。我希望当客户端将枚举编组到状态 yaml 时,将该字符串表示形式用作值。

但是,当我实现 marshalyaml 时(正如我在本演示中所做的那样:https://play.golang.org/p/qtffnooq-dz),客户端 go 返回一个错误:

status.test.phase in body must be of type integer: "string"

status.test.phase是枚举的位置)

没有该函数,它可以正确封送,只是使用整数值。

演示中的 gopkg.in/yaml.v2 (效果很好)和客户端 go 的编组系统之间有什么不同?


解决方案


@maruftuhin 有正确的想法 - 看起来 openapi/operator-sdk 生成 openapi 正在生成一个 crd,由于枚举的类型是 int,因此需要一个整数。

您可以通过在结构中的枚举上方直接添加此 kubebuilder 注释来修复 client-go 的此问题(请参阅 reference):

// +kubebuilder:validation:type=string
enum enum `json:"enum"`

或者只需手动编辑生成的 crd,如下所示

enum:
  type: string

到这里,我们也就讲完了《写出 YAML 格式的 Marshal 和使用 Client Go 处理资源》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>