go没有明确意义上的enum定义,不过可以借助iota
标识符实现一组自增常量值来实现枚举类型。
1.iota自增
func main() {
const (
x = iota //0
y //1
z //2
)
println(x,y,z)
}
func main() {
const (
_ = iota //0
KB = 1 << (10 * iota) //1 << (10*1)
MB //1 << (10*2)
GB //1 << (10*3)
)
println(KB,MB,GB)
}
输出:
1024 1048576 1073741824
自增作用范围为常量组
2.如中断iota,须显式恢复。且后续自增值按行序递增
const (
a = iota //0
b //1
c = 100 //100
d //100 与上一行常量右值表达式相同
e = iota //4 恢复iota自增,按行序递增
f //5
)
3.自增默认是int类型,可显式转换
func main() {
const (
a = iota //int
b float32 = iota //float32
c = iota //int 如果不显式指定,默认为int
)
fmt.Printf("%T, %v\n",a,a)
fmt.Printf("%T, %v\n",b,b)
fmt.Printf("%T, %v\n",c,c)
}
输出:
int, 0
float32, 1
int, 2
4.在实际编码中。建议使用自定义类型实现用途明确的枚举类型
type color byte
const (
black color = iota //指定常量类型
red
blue
)
5.那么常量除了“只读”外,和变量有什么区别呢?
var x = 1
const y = 2
func main() {
println(&x, x)
println(&y, y) //编译错误 &y cannot take the address of y
}
变量在运行期分配存储内存,常量通常会被编译器在预处理阶段直接展开,作为指定数据使用。
网友评论