从 for i := 0 到 range n:Go 循环语法的进化指南

今天早睡
今天早睡
发布时间:2026-08-25| 158人浏览过
原创

前言

Go 里“执行 N 次”是高频场景,但过去往往要写完整的三段式 for。Go 1.22 为整数引入 range 后,这类循环终于有了更直接的表达;本文会结合旧写法、新语法和实际适用边界,帮你判断哪些地方值得改、哪些地方继续保留传统 for。

Go 里最常见的循环之一,就是“把同一个动作执行 N 次”。过去这种场景几乎都要写成 for i := 0; i < n; i++,逻辑并不复杂,但样板代码始终存在。到了 Go 1.22,整数也可以直接配合 range 使用,固定次数循环终于有了更紧凑的表达方式;看完本文,你可以快速判断它和传统写法各自该用在什么地方。

为什么 Go 1.22 要引入整数 range

在日常开发里,固定次数循环非常常见,比如初始化切片、启动多个 goroutine,或者简单重复某段逻辑。Go 1.22 之前,这类代码通常这样写:

传统三段式 for、临时切片 range 与 Go 1.22 整数 range 的对比信息图
三种固定次数循环写法对比把旧写法、新写法和引入动机放在一起看,更容易理解这个语法为何值得加入语言本身。
// 传统的三段式 for 循环
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

这种写法当然没有问题,但如果目标只是“循环 10 次”,那么 i := 0、条件判断和 i++ 其实都是重复性的结构。代码能看懂,却不算简洁。

有些开发者会为了缩短形式,借助一个临时切片来配合 range:

// 创建临时切片的方式
for i := range []int{0,1,2,3,4,5,6,7,8,9} {
    fmt.Println(i)
}

表面上看,这比三段式更短,但它需要额外创建一个切片对象,本质上并不是为“固定次数循环”设计的自然写法。Go 1.22 增加整数 range,就是把这个高频需求直接纳入语言本身。

新写法怎么用:for i := range 10

Go 1.22 允许直接对整数使用 range,写法非常直接:

// Go 1.22 新语法
for i := range 10 {
    fmt.Println(i)  // 输出 0 到 9
}

它表达的意思就是:循环 10 次,变量 i 从 0 递增到 9。换句话说,这段代码与下面的传统写法等价:

for i := 0; i < 10; i++ {
    fmt.Println(i)
}

区别不在能力,而在表达方式。三段式 for 更通用,整数 range 更适合单纯的计数循环。对于只关心“执行 N 次”的代码,新语法的意图更集中,也更接近阅读者的第一反应。

语法规则与可省略写法

循环范围是 [0, n)

整数 range 的基本形式是 for i := range n。这里的 n 可以是整数类型,例如 int、int64 等。循环变量 i 从 0 开始,每轮加 1,在满足 i < n 时继续执行。

Go 1.22 整数 range 的语法规则与省略变量写法示意图
整数 range 的规则读法这一节适合用卡片和箭头把范围规则、省略变量和可读性收益讲清楚。

因此,它的范围是 [0, n):包含 0,不包含 n。这个行为和 Python 的 range(n) 很接近,很多开发者第一次看到就能理解。

不需要索引时可以直接省略变量

如果只是重复执行,不需要拿到索引,也可以省略循环变量:

// 只需要重复执行,不需要索引
for range 5 {
    fmt.Println("Hello, Go 1.22!")
}

这种形式很适合“执行若干次”但不关心第几次的场景。相比声明一个不会使用的变量,它更干净,也能减少读代码时的干扰信息。

哪些表达式可以放在 range 后面

range 后面的整数不必写死成常量,也可以是变量或函数返回值,只要结果是整数类型即可:

count := 10
for i := range count {  // 使用变量
    process(i)
}

for i := range getWorkerCount() {  // 使用函数返回值
    go worker(i)
}

这让新语法在真实项目里有了足够的适应性。你不需要为了配合循环再额外准备中间切片,也不一定要回到完整三段式写法。只要需求仍然是“从 0 开始,连续执行到 n-1”,它就成立。

什么时候该用它,什么时候继续用传统 for

Go 1.22 的这个改动属于典型的“小而实用”。它没有替代所有循环写法,而是给固定次数循环补上了一个更贴切的表达。

如果你的需求就是按次数迭代,例如启动固定数量的 worker、做 N 次初始化或打印、处理一个从 0 开始的计数序列,那么整数 range 往往更合适。代码更短,而且一眼就能看出“循环次数”是核心信息。

但如果循环条件更复杂,例如起始值不是 0、步长不是 1,或者终止条件并不是简单的 i < n,传统的三段式 for 仍然更清晰,也更有表达力。

从语言演进的角度看,很多现代语言都有类似的简化语法,例如 Python 的 range(n)、Ruby 的 n.times、Rust 的 0..n。Go 1.22 引入整数 range,本质上也是让“固定次数循环”这件事写得更直接,而不是改变 Go 原有的控制流模型。

实际使用时,可以把它理解成一个选择标准:当循环的重点是“次数”,用 range n;当循环的重点是“控制过程”,继续用经典 for。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。