go常量

支持类型

数值类型

字符串类型

布尔类型

 

无类型常量(Untyped Constant)

即便两个类型拥有着相同的底层类型,但它们仍然是不同的数据类型,不可以被相互比较或混在一个表达式中进行运算。

type myInt int
const n myInt = 13
const m int = n + 5 // 编译器报错:cannot use n + 5 (type myInt) as type int in const initializer

func main() {
    var a int = 5
    fmt.Println(a + n) // 编译器报错:invalid operation: a + n (mismatched types int and myInt)
}

一:将常量n进行显示转化

type myInt int
const n myInt = 13
const m int = int(n) + 5  // OK

func main() {
    var a int = 5
    fmt.Println(a + int(n))  // 输出:18
}

二:无类型常量

实际在处理时,go进行了隐式转换

type myInt int
const n = 13

func main() {
    var a myInt = 5
    fmt.Println(a + n)  // 输出:18
}

Go 编译器在做隐式转型时,发现无法将常量转换为目标类型,Go 编译器也会报错,比如下面的代码就是这样:

const m = 1333333333

var k int8 = 1
j := k + m // 编译器报错:constant 1333333333 overflows int8

实现枚举

go 的 const 语法提供了“隐式重复前一个非空表达式”的机制

const (
    Apple, Banana = 11, 22
    Strawberry, Grape //11,22
    Pear, Watermelon //11,22
)

iota

iota 是 Go 语言的一个预定义标识符,它表示的是 const 声明块(包括单行声明)中,每个常量所处位置在块中的偏移值(从零开始)。同时,每一行中的 iota 自身也是一个无类型常量,可以像前面我们提到的无类型常量那样,自动参与到不同类型的求值过程中来,不需要我们再对它进行显式转型操作。 

特殊常量,可以认为是一个可以被编译器修改的常量。
在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
隐式重复前一个非空表达式
每个 const 代码块都拥有属于自己的 iota , 每个 iota 的生命周期都始于一个 const 代码块的开始,在该 const 代码块结束时结束
const (
    a1 = 1         //1
    a2 = 2 << iota //2,左移1位 100 ,2*2=4
    a3             //2,左移2位,1000, 2*2*2 = 8
    a4             //2,左移3位, 10000, 2*2*2*2 = 16
)
const (
    aa = 1 << iota //1
    bb             //10 2
    cc             //100 4
    dd             //1000 8
)
const (
    aa, bb = iota, iota + 10 //0, 10
    cc, dd                   //1,11
    ee, ff                   //2,12
)
const (
    aa = 1
    bb = iota //1
    cc        //2
    dd        //3
    ee        //4
    ff        //5
)
const (
    aa = 1
    bb        //1
    cc        //1
    dd = iota //3
    ee        //4
    ff        //5
)
const (
    _  = iota //空白标识符占位
    aa        //1
    _
    bb //3
)

posted on 2022-07-22 11:19  爱吃柠檬不加糖  阅读(65)  评论(0编辑  收藏  举报

导航