cafebabe go入门练习003:常量与iota
知识点
常量的值在编译时就已知,常量的底层类型是基本类型boolean,string或number。
常量定义格式:
const (
e = 2.71828182845904523536028747135266249775724709369995957496696763
pi = 3.14159265358979323846264338327950288419716939937510582097494459
)
常量定义还可以用常量生成器iota,在每个常量声明时,iota从0开始,逐一增长。
如定义星期常量:
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
使用iota结合位运算原理的例子:
package main
import "fmt"
//Flags 表示当前网络状态
type Flags uint
const (
// FlagUp 是否开启
FlagUp Flags = 1 << iota
// FlagBroadcast 是否支持广播
FlagBroadcast
//FlagLoopback 是否支持本地环回
FlagLoopback
//FlagPointToPoint 是否支持点对点网络
FlagPointToPoint
//FlagMulticast 是否支持多播
FlagMulticast
)
//IsUp 判断是否启用网络
func IsUp(v Flags) bool { return v&FlagUp == FlagUp }
//TurnDown 关闭网络
func TurnDown(v *Flags) { *v &^= FlagUp }
//SetBroadcast 设置为广播
func SetBroadcast(v *Flags) { *v |= FlagBroadcast }
//IsCast 判断是否为多播
func IsCast(v Flags) bool { return v&(FlagBroadcast|FlagMulticast) != 0 }
func main() {
var v Flags = FlagMulticast | FlagUp
fmt.Printf("%b %t\n", v, IsUp(v)) // "10001 true"
TurnDown(&v)
fmt.Printf("%b %t\n", v, IsUp(v)) // "10000 false"
SetBroadcast(&v)
fmt.Printf("%b %t\n", v, IsUp(v)) // "10010 false"
fmt.Printf("%b %t\n", v, IsCast(v)) // "10010 true
}