说明:
- 适用于少于32个状态值枚举值的多状态值存储
- 状态值设定为2的指数次值,如[1,2,4,8,16,32,64....]
代码:
type MySys uint32
func (m *MySys) Add(num uint32) {
m.checkNUm(num)
*m |= MySys(num)
}
func (m *MySys) Sub(num uint32) {
m.checkNUm(num)
tmp := *m
if tmp|MySys(num) == tmp {
*m ^= MySys(num)
}
}
func (m *MySys) List() (list []uint32){
tmp , pow := *m , 0
for tmp > 0{
if tmp&1 == 1{
list = append(list,1<<pow)
}
tmp>>=1
pow++
}
return
}
func (m *MySys) checkNUm(num uint32) {
if bits.OnesCount32(num) > 1 {
panic("Only Support One Byte")
}
}
使用示例:
func main(){
var sys models.MySys
sys.Add(1)
sys.Add(2)
sys.Add(4)
sys.Add(8)
fmt.Println("设置后的状态值为:",sys)
sys.Sub(8)
sys.Sub(1)
fmt.Println("删除后的状态值为:",sys)
fmt.Println("状态值列表为:",sys.List())
}
代码截图: