Go Lang 实战

Go枚举(一)

2019-07-30  本文已影响0人  草莓君_

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
}

变量在运行期分配存储内存,常量通常会被编译器在预处理阶段直接展开,作为指定数据使用。

上一篇 下一篇

猜你喜欢

热点阅读