常量
常量声明
常量和变量一样声明,但使用 const 关键字。常量不能使用:=
短声明语法,且声明和初始化必须同时完成:
go
func main() {
// const a // 常量声明和初始化必须同时完成
const a = 100 // 常量只声明而不使用,不会出现编译错误
// a = 101 // 常量不能被修改
// 声明多个常量
const (
b = 200
c = 300
d // 不指定值,与上一行值相同
)
fmt.Println(d) // 输出 300
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
常量值在编译时就知道。因此,它不能被分配给函数调用返回值,因为函数调用发生在运行时。
go
func main() {
var a = math.Sqrt(4)
fmt.Println(a)
const b = math.Sqrt(4) // 编译出错
fmt.Println(b)
}
1
2
3
4
5
6
2
3
4
5
6
有无类型
常量可以是有类型也可以是无类型,有无类型取决于常量声明。无类型常量虽然没有自己的类型,但有默认类型,当不能确定其类型时使用默认类型。有类型常量只能赋值给类型相同的变量。
go
func main() {
const a = 10 // 无类型常量
const b int = 20 // 有类型常量
}
1
2
3
4
2
3
4
预定义常量 iota
Go 中的预定义常量 iota,是一个可被编译器修改的常量:
- iota 在 const 关键字出现时被重置为 0
- const 中每新增一行常量声明将使 iota 计数一次,iota 可理解为 const 语句块中的行索引
go
// 使用常量实现枚举类型
func main() {
// 普通枚举
const (
x = iota
y
z
)
fmt.Println(x, y, z) // 0 1 2
// 自增值枚举
const (
// << 表示左移操作
_ = 1 << (10 * iota) // 左移 0 位
KB // 左移 10 位
MB // 左移 20 位
)
fmt.Println(KB, MB) // 1024 1048576
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19