Go 里最常见的循环之一,就是“把同一个动作执行 N 次”。过去这种场景几乎都要写成 for i := 0; i < n; i++,逻辑并不复杂,但样板代码始终存在。到了 Go 1.22,整数也可以直接配合 range 使用,固定次数循环终于有了更紧凑的表达方式;看完本文,你可以快速判断它和传统写法各自该用在什么地方。
为什么 Go 1.22 要引入整数 range
在日常开发里,固定次数循环非常常见,比如初始化切片、启动多个 goroutine,或者简单重复某段逻辑。Go 1.22 之前,这类代码通常这样写:

// 传统的三段式 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 时继续执行。

因此,它的范围是 [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。













