系列文章目录
前言
如果名称指代的内存位置应该具有 不能更改的固定值,则可以使用 const
关键字
一 声明常量
const
关键字 将变量声明为 只读,这意味着它是 不可更改且只读的。语法如下
const CONSTNAME Type = value
常量的值必须在声明时赋初始值,声明完成之后不允许修改。常量
Go 常量的声明与变量非常相似。区别在于声明常量使用 const
关键字,并且在声明时就必须初始化
- 可以声明多个常量
- 也可以 让编译器自动推导常量的类型
下面是一个在 Go 中声明常量的例子
package main
import "fmt"
const PI float64 = 3.1415926 // 声明一个常量,让编译器从初始值推导类型
func main() {
fmt.Println(PI)
}
二 声明多个常量
为了便于阅读,可以将多个常量分组到一个块中
package main
import "fmt"
const (
A int = 1 // 指定常量的类型
B = 3.14 // 编译器自动推导类型为 float64
C = "Hi!" // 类型自动推导为 string
)
func main() {
fmt.Println(A)
fmt.Println(B)
fmt.Println(C)
}
const
同时声明多个常量时,如果省略了值则表示和上面一行的值相同
package main
import "fmt"
const (
k = 1 // 开始值
m // 默认为上一项 k 的值 1
g
t = 2 // 新的值
p // 默认为上一项 t 的值 2
q
)
func main() {
fmt.Println(k, m, g, t, p, q) // 1 1 1 2 2 2
}
三 iota
常量计数器
iota
是 go
语言的 常量计数器,只能在常量的表达式中使用
iota 在 const 关键字出现时将被重置为 0。 const
中 每新增一行常量声明将使iota 计数一次(加 1)
iota
可理解为const
语句块中的 行索引
使用iota
能简化定义, 在定义枚举时很有用
package main
import "fmt"
func main() {
const (
n1 = iota // 0 const 出现 iota 初始化为 0
n2 // 1
n3 // 2
n4 // 3
n5 // 4
)
fmt.Println(n1, n2, n3, n4, n5)
const (
b1 = iota // 0 const 出现 iota 被重置为 0
b2 // 1
_ = iota // 2 该值被跳过
b3 // 3
)
fmt.Println(b1, b2, b3)
const (
c1 = iota // 0
c2 = 100 // 100
c3 // 100
c4 = iota // 3
c5 // 4
)
fmt.Println(c1, c2, c3, c4, c5)
const (
d1, d2 = iota + 1, iota + 2 // d1 = 1, d2 = 2 iota=0
d3, d4 = iota + 1, iota + 2 // d3 = 2, d4 = 3 iota=1
d5, d6 // d5 = 3, d6 = 4 iota=2
)
// const 一出现,iota 就被重置为 0
// const 中的变量没增加一行,iota 的值就加 1
fmt.Println(d1, d2, d3, d4, d5, d6)
const (
a = 1 << iota // 1 << iota
b // 1 << iota
c // 1 << iota
d // 1 << iota
)
fmt.Println(a, b, c, d) // 1 2 4 8
}
3.1 一个小应用
定义数量级 这里的 <<
表示 左移操作,1 << 10
表示将 1
的二进制表示向左移 10
位, 也就是由 1
变成了 0b10000000000
,也就是十进制的 1024
。 同理 2<<2
表示将 2
的二进制表示向左移 2
位,也就是由 0b10
变成了 0b1000
, 也就是十进制的 8
package main
import "fmt"
func main() {
const (
_ = iota
KB = 1 << (10 * iota) // 1 << 2^10
MB = 1 << (10 * iota) // 1 << 2^20
GB = 1 << (10 * iota) // 1 << 2^30
TB = 1 << (10 * iota) // 1 << 2^40
PB = 1 << (10 * iota) // 1 << 2^50
)
fmt.Println(KB, MB, GB, TB, PB)
}
总结
本节介绍如何在 Go 中声明常量、以及一个 iota
常量计数器