詳解Go 1.22 for循環(huán)的兩處重要更新
Go 1.22 版本于 2024 年 2 月 6 日發(fā)布,引入了幾個重要的特性和改進(jìn)。在語言層面上,這個版本對 for 循環(huán)進(jìn)行了兩處更新:
- 循環(huán)的每次迭代都會創(chuàng)建新變量
- 循環(huán)支持對整數(shù)范圍進(jìn)行迭代
本文將會對 for 循環(huán)的兩個更新進(jìn)行介紹。
準(zhǔn)備好了嗎?準(zhǔn)備一杯你最喜歡的咖啡或茶,隨著本文一探究竟吧。
循環(huán)的每次迭代都會創(chuàng)建新變量
在 Go 1.22 版本之前,for 循環(huán)聲明的變量只創(chuàng)建一次,并在每次迭代中更新。在 Go 1.22中,循環(huán)的每次迭代都會創(chuàng)建新變量,這將會避免意外的共享錯誤發(fā)生。
通過相同的代碼示例在不同 Go 版本中運行,我們可以清楚地看到運行結(jié)果之間的區(qū)別,從而感受到語言更新帶來的具體影響。
Go 1.21版本的代碼示例
package main
import "fmt"
func main() {
done := make(chan bool)
values := []string{"chen", "ming", "yong"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// 結(jié)束前等待所有的 goroutine 執(zhí)行成
for _ = range values {
<-done
}
}
代碼運行結(jié)果如下所示:
yong
yong
yong
在
for循環(huán)體里,匿名函數(shù)與循環(huán)變量v形成了閉包。閉包捕獲了v的引用(或說地址),這導(dǎo)致所有的閉包實例在訪問v時實際上都訪問的是同一個內(nèi)存地址。由于v只創(chuàng)建一次,并且每次迭代都會更新。因此最終的打印結(jié)果都是同一個值yong。Go 1.22版本代碼示例
package main
import "fmt"
func main() {
done := make(chan bool)
values := []string{"chen", "ming", "yong"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// 結(jié)束前等待所有的 goroutine 執(zhí)行成
for _ = range values {
<-done
}
}
代碼運行結(jié)果如下所示:
yong
ming
chen
在
Go 1.22中,循環(huán)的每次迭代都會創(chuàng)建新變量v,這意味著每個閉包都持有對不同v變量的引用,因此,最終打印的結(jié)果將各不相同。循環(huán)的每次迭代都會創(chuàng)建新變量 的這一更新,有效避免了以往版本中常見的閉包陷阱,提高了代碼的安全性和可預(yù)測性。
循環(huán)支持對整數(shù)范圍進(jìn)行迭代
在 Go 1.22 版本之前,當(dāng)我們使用 for range 時,僅支持 array or slice、string、map 和 channel 類型的表達(dá)式進(jìn)行迭代,而自 Go 1.22 版本起,額外新增對 interger 類型的支持,這意味著我們能夠直接使用整數(shù)進(jìn)行循環(huán)迭代。
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(i)
}
}
對于整數(shù)值 10,迭代值從 0 到 9 按遞增順序生成。如果 range 后面的表達(dá)式為 0,則循環(huán)不進(jìn)行任何迭代。
小結(jié)
本文介紹了 Go 1.22 版本對 for 循環(huán)所做的兩處重要更新:循環(huán)的每次迭代都會創(chuàng)建新變量 和 循環(huán)支持對整數(shù)范圍進(jìn)行迭代。
循環(huán)的每次迭代都會創(chuàng)建新變量,有效避免了以往版本中常見的閉包陷阱,提高了代碼的安全性和可預(yù)測性。
循環(huán)支持對整數(shù)范圍進(jìn)行迭代,極大地增強(qiáng)了 for 循環(huán)的靈活性,使得編寫計數(shù)循環(huán)更加直接和簡潔。
到此這篇關(guān)于詳解Go 1.22 for循環(huán)的兩處重要更新的文章就介紹到這了,更多相關(guān)Go 1.22 for循環(huán)更新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實現(xiàn)自己的Redis(有序集合跳表)實例探究
這篇文章主要為大家介紹了Golang實現(xiàn)自己的Redis(有序集合跳表)實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go語言如何實現(xiàn)將[][]byte轉(zhuǎn)為io.Reader
本文主要介紹了如何在Go語言中實現(xiàn)將[][]byte轉(zhuǎn)換為io.Reader,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2025-02-02
golang socket斷點續(xù)傳大文件的實現(xiàn)方法
今天小編就為大家分享一篇golang socket斷點續(xù)傳大文件的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

