詳解Go 1.22 for循環(huán)的兩處重要更新
Go 1.22 版本于 2024 年 2 月 6 日發(fā)布,引入了幾個(gè)重要的特性和改進(jìn)。在語言層面上,這個(gè)版本對(duì) for 循環(huán)進(jìn)行了兩處更新:
- 循環(huán)的每次迭代都會(huì)創(chuàng)建新變量
- 循環(huán)支持對(duì)整數(shù)范圍進(jìn)行迭代
本文將會(huì)對(duì) for 循環(huán)的兩個(gè)更新進(jìn)行介紹。
準(zhǔn)備好了嗎?準(zhǔn)備一杯你最喜歡的咖啡或茶,隨著本文一探究竟吧。
循環(huán)的每次迭代都會(huì)創(chuàng)建新變量
在 Go 1.22 版本之前,for 循環(huán)聲明的變量只創(chuàng)建一次,并在每次迭代中更新。在 Go 1.22中,循環(huán)的每次迭代都會(huì)創(chuàng)建新變量,這將會(huì)避免意外的共享錯(cuò)誤發(fā)生。
通過相同的代碼示例在不同 Go 版本中運(yùn)行,我們可以清楚地看到運(yùn)行結(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
}
}
代碼運(yùn)行結(jié)果如下所示:
yong
yong
yong
在
for循環(huán)體里,匿名函數(shù)與循環(huán)變量v形成了閉包。閉包捕獲了v的引用(或說地址),這導(dǎo)致所有的閉包實(shí)例在訪問v時(shí)實(shí)際上都訪問的是同一個(gè)內(nèi)存地址。由于v只創(chuàng)建一次,并且每次迭代都會(huì)更新。因此最終的打印結(jié)果都是同一個(gè)值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
}
}
代碼運(yùn)行結(jié)果如下所示:
yong
ming
chen
在
Go 1.22中,循環(huán)的每次迭代都會(huì)創(chuàng)建新變量v,這意味著每個(gè)閉包都持有對(duì)不同v變量的引用,因此,最終打印的結(jié)果將各不相同。循環(huán)的每次迭代都會(huì)創(chuàng)建新變量 的這一更新,有效避免了以往版本中常見的閉包陷阱,提高了代碼的安全性和可預(yù)測(cè)性。
循環(huán)支持對(duì)整數(shù)范圍進(jìn)行迭代
在 Go 1.22 版本之前,當(dāng)我們使用 for range 時(shí),僅支持 array or slice、string、map 和 channel 類型的表達(dá)式進(jìn)行迭代,而自 Go 1.22 版本起,額外新增對(duì) interger 類型的支持,這意味著我們能夠直接使用整數(shù)進(jìn)行循環(huán)迭代。
package main
import "fmt"
func main() {
for i := range 10 {
fmt.Println(i)
}
}
對(duì)于整數(shù)值 10,迭代值從 0 到 9 按遞增順序生成。如果 range 后面的表達(dá)式為 0,則循環(huán)不進(jìn)行任何迭代。
小結(jié)
本文介紹了 Go 1.22 版本對(duì) for 循環(huán)所做的兩處重要更新:循環(huán)的每次迭代都會(huì)創(chuàng)建新變量 和 循環(huán)支持對(duì)整數(shù)范圍進(jìn)行迭代。
循環(huán)的每次迭代都會(huì)創(chuàng)建新變量,有效避免了以往版本中常見的閉包陷阱,提高了代碼的安全性和可預(yù)測(cè)性。
循環(huán)支持對(duì)整數(shù)范圍進(jìn)行迭代,極大地增強(qiáng)了 for 循環(huán)的靈活性,使得編寫計(jì)數(shù)循環(huán)更加直接和簡(jiǎn)潔。
到此這篇關(guān)于詳解Go 1.22 for循環(huán)的兩處重要更新的文章就介紹到這了,更多相關(guān)Go 1.22 for循環(huán)更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中的sync.WaitGroup用法實(shí)例
這篇文章主要介紹了Golang中的sync.WaitGroup用法實(shí)例,WaitGroup的用途,它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成,需要的朋友可以參考下2015-07-07
go語言VScode?see?'go?help?modules'?(exit?statu
最近上手學(xué)習(xí)go語言,準(zhǔn)備在VSCode上寫程序的時(shí)候卻發(fā)現(xiàn)出了一點(diǎn)問題,下面這篇文章主要給大家介紹了關(guān)于go語言VScode?see?'go?help?modules'(exit?status?1)問題的解決過程,需要的朋友可以參考下2022-07-07
Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架使用詳解
這篇文章主要為大家介紹了如何使用Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Go語言中的init函數(shù)特點(diǎn)及用法詳解
在Go語言中,init()函數(shù)是一種特殊的函數(shù),用于在程序啟動(dòng)時(shí)自動(dòng)執(zhí)行一次。它的存在為我們提供了一種機(jī)制,可以在程序啟動(dòng)時(shí)進(jìn)行一些必要的初始化操作,為程序的正常運(yùn)行做好準(zhǔn)備,在這篇文章中,我們將詳細(xì)探討init()函數(shù)的特點(diǎn)、用途和注意事項(xiàng)2023-06-06
Golang環(huán)境變量設(shè)置和查看工具go env詳解
go env 是 Go 工具鏈中的一個(gè)命令,用于設(shè)置和查看當(dāng)前 Golang 環(huán)境的相關(guān)信息,對(duì)于理解、編譯和運(yùn)行 Golang 程序非常有用,本文就給大家簡(jiǎn)單的介紹一下Golang環(huán)境變量設(shè)置和查看工具go env,需要的朋友可以參考下2023-07-07
Go語言Http?Server框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的httpServer
這篇文章主要為大家介紹了Go語言Http?Server框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的httpServer抽象,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

