• 为什么 Go1.22 for 循环要支持整数范围?
  • 发布于 2个月前
  • 343 热度
    0 评论
  • Jeanks
  • 0 粉丝 25 篇博客
  •   
很多小伙伴对Go1.22中的 for 循环会整型范围迭代的特性感觉不太理解,为什么那么多东西没支持。这都能入围?

我特意去翻了一下原始的 discussions,for 循环加整数迭代这事,是由 Go 核心团队负责人 @Russ Cox(下称:rsc)直接发起的。(惊不惊喜,意不意外?)

为什么加整型范围
加的的原因也很直接,rsc 表示:对于不是来自 C 语言系列的开发者来说,一个常见的问题是要理解 Go 语言的习惯用法。

如下代码:
for i := 0; i < n; i++ { ... }
当你停下来解释它时,你会发现 “数到 n” 是一个很机械的过程。因此如果你在 Go 工程中经常要用到时,你希望简化这一写法,常常会定义一个标准函数。

如下代码:
for i := range count(n) { ... }
如此一来,这将会成为计数到 n 的新用法。那么新自定义的 count 函数,会造成每个程序都会导入一些包。但是,从 0 到 n 的计数非常常见,甚至值得使用一个预定义函数去做这件事。我们可以从语言变化层面出发,让 for 循环支持整型范围类型的迭代,这是有意义的。

因此最终新增了前文提到的特性,也就是整型类型的 for 循环迭代支持。用以下代码:
for i := range n { ... }
来替代:
for i := 0; i < n; i++ { ... }
甚至他还贴心的提到:
对于以前的 C、C++ 和 Java 程序员来说,不编写 3 子句的 for 循环想法可能看起来很陌生。一开始我(指的是 rsc 自己)也是如此。但我们一旦采用了这种变更,for range 这种范围形式很快就会变得惯用,并且 3 子句的循环看起来就像用分号结束语句一样过时。


翻译一下
写到这里,我不得不说 rsc 确实是 “学术派” 的代表,给的理由看着都非常充分。这里就由本煎鱼来简单粗暴的翻译一下。仰望一下大佬的想法。说白了,就是 rsc 看到和接触到身边很多人(非 C 语言系列的开发者)。在做从 0 到 n 的计数时,非常不习惯,也不太理解,提了一些意见给他。

所以我(rsc)要加这个特性到 for range 了,加进去后能让代码更简洁、高效,不需要额外引入包。我们做这个事,就跟把过时的分号作为结束语句去掉一样。这是更先进的!

总结
本次的优化从出发角度来看,主要是统一 for 循环迭代的使用。以前每次要做 0 到 n 的计数时,还是不够方便的。加进来后确实可以产生一定的提效。但这种用途的场景确实也比较少。也能看的出,rsc 提的功能特性的提案。相较于其他人而言,真的是更容易加入了。
用户评论