Go在项目中如何定义枚举类型

233 阅读1分钟

关于枚举设计的几个思考点

1.易于维护

go没有其他面向对象语言那样丰富的枚举类型设计,但是枚举在项目中我们常常用到,且枚举在不断调整,所以
易于维护的编码设计极其重要,下面我出一个易于维护的设计思想,且在维护过程中不易出错.

2.处理方便

主要维护点:init中map的维护,const数值的维护
主要的方法:String(),Value(),Parse()

type OrderStatus int

var OrderStatusMap map[OrderStatus]string

func init() {
	OrderStatusMap = make(map[OrderStatus]string)
	OrderStatusMap[Created] = "Created"
	OrderStatusMap[Paided] = "Paided"
	OrderStatusMap[Delivering] = "Delivering"
	OrderStatusMap[Completed] = "Completed"
	OrderStatusMap[Canceled] = "Canceled"
}

const (
	Unkown     OrderStatus = 0 //未定义状态
	Created    OrderStatus = 1 //使用数字,禁用iota,原因:方便直接知道值是多少;避免中间插入新值影响原有的值
	Paided     OrderStatus = 2
	Delivering OrderStatus = 3
	Completed  OrderStatus = 4
	Canceled   OrderStatus = 5
)

func (i OrderStatus) String() string {
	return OrderStatusMap[i]
}

func (i OrderStatus) Value() int {
	return int(i)
}

func ParseOrderStatus(name string) (OrderStatus, error) {
	for k, v := range OrderStatusMap {
		if v == name {
			return k, nil
		}
	}
	return Unkown, errors.New("Unkown")
}