Go实现枚举值

Go语言并没有提供enum的定义,我们可以使用const来模拟枚举类型,这也是Go语言中约定俗成的方式。

例如,在Kubernetes项目中,有大量的以常量形式定义的"枚举值":

// PodPhase is a label for the condition of a pod at the current time.
type PodPhase string

// These are the valid statuses of pods.
const (
	// PodPending means the pod has been accepted by the system, but one or more of the containers
	// has not been started. This includes time before being bound to a node, as well as time spent
	// pulling images onto the host.
	PodPending PodPhase = "Pending"
	// PodRunning means the pod has been bound to a node and all of the containers have been started.
	// At least one container is still running or is in the process of being restarted.
	PodRunning PodPhase = "Running"
	// PodSucceeded means that all containers in the pod have voluntarily terminated
	// with a container exit code of 0, and the system is not going to restart any of these containers.
	PodSucceeded PodPhase = "Succeeded"
	// PodFailed means that all containers in the pod have terminated, and at least one container has
	// terminated in a failure (exited with a non-zero exit code or was stopped by the system).
	PodFailed PodPhase = "Failed"
	// PodUnknown means that for some reason the state of the pod could not be obtained, typically due
	// to an error in communicating with the host of the pod.
	PodUnknown PodPhase = "Unknown"
)

如何跨服务高效维护枚举值

如果只是项目内部使用枚举值比较简单,定义完了内部使用即可,但涉及到跨服务之间调用,或者前后端协作时,效率就比较低了。当服务需要给外部调用者展示接口能力时,往往需要生成API接口文档(或者接口定义文件,例如proto),往往也需要根据接口文档(文件)生成调用的客户端SDK

如果是接口定义文件,例如proto,往往可以直接查看源码来解决这个问题,问题不大。我们这里主要讨论的是接口文档维护枚举值的问题,特别是前后端协作时通过OpenAPI标准协议来维护枚举值的问题。这里我们提供了专门的工具来维护这些枚举值,具体请参考章节:枚举维护-gen enums





Content Menu

  • No labels