在 Go 语言的发展历程中,每一次版本更新都带来了一些令人惊喜的改进。Go 1.22 版本引入了一个看似简单却非常实用的新特性——range 整数,这个特性让我们的循环代码变得更加简洁优雅。

从一个常见场景说起

在日常开发中,我们经常需要执行固定次数的循环操作。比如初始化一个切片、并发启动多个 goroutine、或者简单地重复某个操作 N 次。在 Go 1.22 之前,我们通常这样写:

// 传统的三段式 for 循环
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

这种写法虽然经典,但确实有些冗长。特别是当我们只需要一个简单的计数循环时,i := 0i++ 这些样板代码显得有些多余。有些开发者为了简化,甚至会创建一个临时的切片:

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

这种方式虽然代码看起来简洁了一些,但性能上并不理想,因为它需要额外创建一个切片对象。Go 1.22 的 range 整数特性,正是为了解决这个问题而生。

新特性:range 整数

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++,但代码更加简洁明了。

核心特性详解

基本语法规则

range 整数的语法规则很简单:for i := range n,其中 n 是一个整数类型(int、int64 等)。循环变量 i 从 0 开始,每次递增 1,直到 i < n 时停止。

需要注意的是,循环范围是 [0, n),即包含 0 但不包含 n。这与 Python 的 range(n) 函数行为一致,符合大多数程序员的直觉。

灵活的返回值

range 切片类似,range 整数也支持忽略循环变量的写法:

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

这种写法特别适合那些不需要索引的场景,比如简单地重复某个操作若干次。代码意图一目了然,没有多余的信息干扰。

支持的表达式类型

range 后面的整数可以是任何整数类型的表达式,包括常量、变量、函数返回值等:

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

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

这种灵活性让 range 整数可以适应各种实际场景,不需要额外的中间变量。

写在最后

许多现代编程语言都提供了类似的语法糖。Python 的 range(n)、Ruby 的 n.times、Rust 的 0..n 等,都是类似的循环简化语法。Go 1.22 引入这个特性,让 Go 在语法简洁性上与其他现代语言保持了同步。

Go 1.22 的 range 整数特性是一个小而美的改进。它让简单的计数循环变得更加简洁优雅,减少了样板代码,提升了代码可读性。

在实际开发中,合理使用这个新特性,可以让我们的代码更加清晰易懂。当然,传统的三段式 for 循环仍然有其不可替代的价值,选择哪种方式应该根据具体场景来决定。