為什麼 Go1.22 for 迴圈要支援整數範圍?

帶你聊技術發表於2024-01-24

來源:腦子進煎魚了

大家好,我是煎魚。

前段時間分享了《Go1.22 新特性:for 迴圈不再共享迴圈變數,且支援整數範圍》的新特性介紹。

很多小夥伴對其中的 for 迴圈會整型範圍迭代的特性感覺不太理解,為什麼那麼多東西沒支援。這都能入圍?

為什麼 Go1.22 for 迴圈要支援整數範圍?

我特意去翻了一下原始的 discussions,for 迴圈加整數迭代這事,是由 Go 核心團隊負責人 @Russ Cox(下稱:rsc)直接發起的。(驚不驚喜,意不意外?)

為什麼 Go1.22 for 迴圈要支援整數範圍?

為什麼加整型範圍

加的的原因也很直接,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 提的功能特性的提案。相較於其他人而言,真的是更容易加入了。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024922/viewspace-3004873/,如需轉載,請註明出處,否則將追究法律責任。

相關文章