golang constants

常量是在编译期被创建。因为在编译期必须确定其值,因此在声明常量时有一些限制。

  • 其类型必须是numbers, characters (runes), strings or booleans
  • 表达式必须是在编译期可计算的
  • 声明常量的同时必须进行初始化,其值不可再次修改

语法

const关键字用于声明常量

const[(] 名称 [数据类型] = 表达式 [)]
const (多个常量名称 [数据类型] = 对应的多个表达式)

如果定义多行常量而表达式一致时可省略其他行的表达式
声明时如果不指定数据类型,则该常量为无类型常量

常量赋值

1
const pi = 3.1415926 // float64

同时声明多个常量并赋值且类型不一样

1
const a, b, c = 1, false, "hello world"

声明需要计算的常量

1
const d = 1 << 2

批量声明常量

1
2
3
4
const (
Monday, Tuesday, Wednesday = 1, 2, 3
Thursday, Friday, Saturday = 4, 5, 6
)

声明常量时,指定数据类型,e与f都为float64类型

1
const e, f float64 = 1, 2/1.0

声明常量并指定不同的类型

1
const g int, h float64 = 1, 2/1.0

iota关键字

iota默认从0开始。当iota在紧跟着关键字const的第一行出现时,iota为0,在第二行出现时,iota为1,以此类推;当iota再次遇到关键字const时,重置为0。

基本使用

直接使用iota赋值第一个常量,则第一个常量值从0开始被赋值,顺序第二个是1,以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

const (
a = iota
b
c
d
)
func main() {
fmt.Println("a:", a, " ,b:", b, " ,c:", c, " ,d:", d)
}
#Output:
# a: 0 ,b: 1 ,c: 2 ,d: 3

混合表达式使用

iota结合基本表达式,实现值的按指定规律赋值的要求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"

const (
a = 1 << iota
b
c
d
)
func main() {
fmt.Println("a:", a, " ,b:", b, " ,c:", c, " ,d:", d)
}
#Output:
# a: 1 ,b: 2 ,c: 4 ,d: 8

上述代码中,常量的赋值依次是1 << 0,1 << 1,1 << 2,1 << 3。

同时多个iota使用

因为iota的赋值是在下一行才会进行递增,所以在一行内同时指定多个iota,即实现了多变量按规则递增赋值的要求。
如果某行的变量不想赋值,则使用下划线代替(即占位)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

const (
// iota 会在下一行开始递增
a, d = 1+iota, 13 + iota
b, e
c, _
f, g
)

func main() {
fmt.Println("a:", a, " ,b:", b, " ,c:", c, " ,d:", d, " ,e:", e, " ,f:", f, " ,g:", g)
}
#Output:
# a: 1 ,b: 2 ,c: 3 ,d: 13 ,e: 14 ,f: 4 ,g: 16

文档

坚持原创技术分享,如果觉得文章对你有帮助,给点鼓励更好!