模块 1 · 第 3 课(共 5)课程中的3/50~10 min
模块课程(3/5)
常数和 iota
常量是编译时已知的不可变值。在 Go 中它们是
使用 const 声明,并且可以是typed 或untyped。无类型的有一个
超能力:它们会适应环境所需的类型,从而饶过你
不必编写显式转换。
基本语法
Go
const PI = 3.14
const MaxRetry int = 5
const Name = "eLearner"MaxRetry 的类型为 (int):您只能将其分配给 int。
PI 和 Name 是无类型:它们的行为类似于“文字”并适应
上下文。
Go
const PI = 3.14
var f float32 = PI // ok: PI è non tipata, diventa float32
var d float64 = PI // okconst 块
您可以将多个常量分组在一个块中:
Go
const (
StateInitial = "INIT"
StateReady = "READY"
StateError = "ERROR"
)iota:枚举计数器
在 const 块内,特殊标识符 iota 从 0 开始
并且每行加 1。这是进行枚举的惯用语:
Go
const (
Monday = iota // 0
Tuesday // 1
Wednesday // 2
Thursday // 3
Friday // 4
)如果后续行不提供表达式,则它们继承该表达式。
这就是为什么编写 Tuesday 就足够了,而无需重复 = iota 。
带有表达式的模式
iota 可以出现在任意表达式内:
Go
const (
KB = 1 << (10 * (iota + 1)) // 1 << 10 = 1024
MB // 1 << 20
GB // 1 << 30
TB // 1 << 40
)跳过一个值
如果您不想为一行分配值(因为您希望 iota
无论如何递增),使用空白标识符 _:
Go
const (
_ = iota // scarta 0
KB // 1
MB // 2
)轮到你了
锻炼#go.m1.l3.e1
尝试:0加载中...
在包级别声明一个值为 3.14 的常量 PI,然后在 main 中打印它。
正在加载编辑器...
显示提示
`const PI = 3.14` 在包级别,在 main 之外。
3 次尝试后可用的解决方案
锻炼#go.m1.l3.e2
尝试:0加载中...
使用 iota 定义一个 const 块,其中星期几(星期一、星期二、星期三)从 1 开始编号。
正在加载编辑器...
显示提示
在块的第一行使用 `iota + 1`;后续行继承该表达式。
3 次尝试后可用的解决方案
Quiz#go.m1.l3.e3
准备好这个程序打印什么?
Go
const (
A = iota * 2
B
C
)
fmt.Println(A, B, C)回顾
const用于编译时已知的不可变值。- 无类型常量适应上下文:不需要转换。
const ( ... )块组相关值。iota在每个块中从 0 开始并逐行递增。- 模式:枚举 (
= iota)、位掩码 (= 1 << iota)、单位 (= 1 << (10*iota))。