跳转到主要内容
模块 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  // ok

const 块

您可以将多个常量分组在一个块中:

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))。