1.6. 常量-恒定不变的值

常量表示起来非常简单,如下面的代码:

const pi = 3.1415926
const e = 2.78281

多个变量一起声明,类似的,常量也可以多个一起声明。如下:

const (
    const pi = 3.1415926
    const e = 2.78281
)

常量因为在编译期确定,所以可以用于数组声明,如下的代码:

const size = 4
var arr [size]int

1.6.1. 枚举 — 一组常量值

GO语言中没有枚举,可以使用常量配合iota模拟枚举。

第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1;

package main

import "fmt"

const (
    Unknown = 0
    Female  = 1
    Male    = 2
    a       = 10
    b
    c
    d = iota
    e = iota
    f = iota
    j
    h
    m
)

func main() {
    fmt.Println(Unknown, Female, Male)
    fmt.Println(a, b, c)
    fmt.Println(d, e, f)
    fmt.Println(j, h, m)
}


/*
0 1 2
10 10 10
6 7 8
9 10 11
*/
package main

import "fmt"

type Weapon int         // 将int定义为Weapon类型,本质是一个int一样。

const (
    Arrow Weapon = iota     // 开始生成枚举值,默认为0开始,常量值自动生成
    Shuriken
    Shufiken
    SniperRifle
    Rifle
    Blower
)

func main() {
    fmt.Println(Arrow, Shuriken, Shufiken, SniperRifle, Rifle, Blower)
    //使用枚举类型并赋初值
    var weapon  Weapon = Blower
    fmt.Println(weapon)
}


//0 1 2 3 4 5
//5

使用iota做一些强大的枚举常量值生成器,如下

package main

import "fmt"

const (
    FlagNone = 1 << iota
    FlagRed
    FlagGreen
    FlagBlue
)

func main() {
    fmt.Printf("%d %d %d\n", FlagRed, FlagGreen, FlagBlue)      //2 4 8   每一次值左移一位的结果
    fmt.Printf("%b %b %b\n", FlagRed, FlagGreen, FlagBlue)      //10 100 1000  二进制格式输出
}

1.6.2. 将枚举值转换为字符串

package main

import "fmt"

//声明芯片类型
type ChipType int

const (
    None ChipType = iota // 从0开始每行值加1
    CPU
    GPU
)

// 定义ChipType类型的方法返回字符串
func (c ChipType) String() string {
    switch c {
    case None:
        return "None"
    case CPU:
        return "CPU"
    case GPU:
        return "GPU"
    }
    return "N/A"
}

func main() {
    fmt.Printf("%s %d", CPU, CPU)

}

//CPU 1