一、常量

定义常量也可以不指定类型,会自动判断类型使用

func consts() {
    const filename = "file.txt"
    const a, b = 3, 4
    var c int
    c = int(math.Sqrt(a*a + b*b))
    fmt.Println(filename, c)
}

也可以把多个常量放在 const()

func consts() {
    const (
        filename = "file.txt"
        a, b     = 3, 4
    )

    fmt.Println(filename, a, b)
}

二、枚举

1. 普通枚举类型

go 没有专门用来做枚举的关键字,所以使用const的方式实现枚举

func enums() {
    const (
        cpp    = 0
        java   = 1
        python = 2
        golang = 3
    )
    fmt.Println(cpp, java, python, golang) // 0 1 2 3
}

2. 自增枚举类型

go 提供iota表示这组const值是自增的,实现更方便的定义枚举

func enums() {
    const (
        cpp = iota
        java
        python
        golang
    )
    fmt.Println(cpp, java, python, golang) // 0 1 2 3
}

使用下划线_,忽略某个值

func enums() {
    const (
        cpp = iota
        _
        python
        golang
    )
    fmt.Println(cpp, python, golang) // 0 2 3
}

iota 其实是一个表达式,有更加复杂的用法

func enums() {
    const (
        b  = 1 << (10 * iota) // << 小数点不变,数字左移位运算:1左移位数(10*0)=0
        kb                    // 1左移位数(10*1)= 10,左移10位,就是10000000000,十进制就是1024
        mb
        gb
        tb
        pb
    )

    // b, kb, mb, gb, tb, pb
    fmt.Println(b, kb, mb, gb, tb, pb)
}