go语言学习十一 - 枚举

        go 语言没有定义枚举类型,实现枚举的方式是通过定义一系列的自定义类型的常量来实现,go 语言中关于枚举的极简方式是 go 哲学的典型:go 语言为程序员提供他们所需要的一切,包括很多强大而方便的特性,同时又让语言尽可能的保持简小、连贯而且快速的编译和运行。

package weeks

type week int //设置为不导出,避免调用者设置超出枚举范围的值 比如 week(8)

const (
	Sunday week = iota // if set 0 , the Following const are all 0
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Saturday
)

var wnMap = map[week]string{
	Sunday:    "Sunday",
	Monday:    "Monday",
	Tuesday:   "Tuesday",
	Wednesday: "Wednesday",
	Thursday:  "Thursday",
	Friday:    "Friday",
	Saturday:  "Saturday", //must end with ,
}

func (w week) IsRestDay() bool {
	return w == Saturday || w == Sunday
}

func (w week) String() string {
	if v, ok := wnMap[w]; ok {
		return v
	}
	//由于 week 类型设置为私有不导出,其实这个错误不会发生
	return "invalid value"
}

package bitflags

import (
	"fmt"
	"strings"
)

type BitFlag int

//const values as other languge enumeration

const (
	Active BitFlag = 1 << iota
	Send
	Receive
)

//how to print BitFlag const value
func (flag BitFlag) String() string {

	var flags []string

	//flags := []string{} //warning: Empty slice declaration via literal
	//suggestion: (1) var flags []string   (2) flags := make([]string,0)

	if flag&Active == Active {
		flags = append(flags, "Active")
	}

	if flag&Send == Send {
		flags = append(flags, "Send")
	}

	if flag&Receive == Receive {
		flags = append(flags, "Receive")
	}

	if len(flags) > 0 {
		return fmt.Sprintf("%d(%s)", int(flag), strings.Join(flags, "|")) //这里如果不强制转换为int型将触发String()方法的递归调用死循环
	}

	return "0()"

}

package main

import (
	"bitflags"
	"fmt"
	"weeks"
)

func main() {
	const limit = 512 //类型兼容任何数字类型
	const top uint16 = 1421 // const initial can not use  :=
	const start = byte(19)  // 指定与默认推断类型不一致的类型 , 默认推断19为int64

	d := weeks.Monday
	fmt.Printf("%v is a rest day? %t.\n", d, d.IsRestDay())
	fmt.Println(bitflags.Active, bitflags.Send, bitflags.Active|bitflags.Send, bitflags.Active|bitflags.Send|bitflags.Receive)
}

转载于:https://www.cnblogs.com/scala/p/9588775.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值