為什麼 Go1.22 for 迴圈要支援整數範圍?
來源:腦子進煎魚了
大家好,我是煎魚。
前段時間分享了《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 提的功能特性的提案。相較於其他人而言,真的是更容易加入了。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024922/viewspace-3004873/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 隨機範圍小數和隨機範圍整數隨機
- C++之for迴圈、範圍for語句探究C++
- 為什麼迴圈佇列要浪費一個儲存空間佇列
- 為什麼要重構?深入探討重構的原則、範圍和時機
- 讓自定義的容器,也能基於範圍迴圈
- 為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?DockerK8S
- 為什麼要有事件迴圈機制(Event Loop)事件OOP
- js中為什麼for迴圈比forEach效能高?JS
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- Linux UID是什麼?其數值範圍有哪些?LinuxUI
- js生成一定範圍內的隨機整數JS隨機
- Spring——為什麼會有迴圈依賴(原始碼)Spring原始碼
- java 生成一個隨機整數,範圍從 1 到 10Java隨機
- MATLAB中如何生成指定範圍的隨機整數向量Matlab隨機
- C語言之有符號無符號整數取值範圍C語言符號
- 為什麼要removeREM
- 為什麼要敏捷?敏捷
- 專案為何總是做不完?範圍管理要界定(轉)
- 為什麼程式要從0開始計數
- matlab 從某個範圍內隨機取出一個整數Matlab隨機
- Python 為什麼不設計 do-while 迴圈結構?PythonWhile
- foreach迴圈中為什麼不要進行remove/add操作REM
- 為什麼不建議在for迴圈中使用"+"進行字串拼接字串
- 為什麼對陣列排序讓Python迴圈執行更快陣列排序Python
- 為什麼要code reviewView
- mybatis list作為引數 foreach迴圈MyBatis
- 為什麼要打造智慧數字經營門店?
- 事件迴圈Event loop到底是什麼事件OOP
- matlab之在迴圈中修改迴圈變數Matlab變數
- 為什麼谷歌要執行嚴格的程式碼編寫規範谷歌
- 【redis前傳】redis整數集為什麼不能降級Redis
- 為什麼我的gridview.DataKeys.count總是為零?並提示索引超出範圍View索引
- 為什麼要學習 RustRust
- 為什麼要學習 Julia
- 為什麼要指令重排序?排序
- 為什麼要學習 Vim?
- 為什麼要選擇SQL?SQL
- MySQL為什麼要set namesMySql