查看原文
其他

为什么 Go1.22 for 循环要支持整数范围?

陈煎鱼 脑子进煎鱼了 2024-05-03

大家好,我是煎鱼。

前段时间分享了《Go1.22 新特性:for 循环不再共享循环变量,且支持整数范围》的新特性介绍。

很多小伙伴对其中的 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 提的功能特性的提案。相较于其他人而言,真的是更容易加入了。

推荐阅读


关注和加煎鱼微信,

一手消息和知识,拉你进技术交流群👇



你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路

日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!


原创不易 点赞支持

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存