定了:Go 1.22將修復(fù)for循環(huán)變量錯(cuò)誤
出品 | OSC開源社區(qū)(ID:oschina2013)
根據(jù) Go 開發(fā)團(tuán)隊(duì)技術(shù) leader Russ Cox (rsc) 的介紹,Go 開發(fā)者經(jīng)常會(huì)犯的錯(cuò)誤是在循環(huán)迭代結(jié)束后,保留對循環(huán)變量的引用,此時(shí)它會(huì)采用預(yù)期之外的新值。 例如下面的程序:
func main() {
done := make(chan bool)
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v)
done <- true
}()
}
// wait for all goroutines to complete before exiting
for _ = range values {
<-done
}
}
其創(chuàng)建的三個(gè) goroutine 都用于打印相同的變量 v ,因此它們只會(huì)打印出 “c”, “c”, “c”,而不是按順序打印 “a”, “b”, 和 “c”。
從 Go1.21 開始,開發(fā)者可以啟用 GOEXPERIMENT=loopvar 來構(gòu)建 Go 程序,以解決上文提到的 for 循環(huán)變量問題。
構(gòu)建命令:
GOEXPERIMENT=loopvar go install my/program
GOEXPERIMENT=loopvar go build my/program
GOEXPERIMENT=loopvar go test my/program
GOEXPERIMENT=loopvar go test my/program -bench=.
...
現(xiàn)在 Go 開發(fā)團(tuán)隊(duì)表示,從 Go1.22 開始,新的 for 循環(huán)語義將會(huì)在 go.mod 文件中的 Go 版本大于等于 Go1.22 下默認(rèn)啟用。 < END > 我們創(chuàng)建了一個(gè)高質(zhì)量的技術(shù)交流群,與優(yōu)秀的人在一起,自己也會(huì)優(yōu)秀起來,趕緊 點(diǎn)擊加群 ,享受一起成長的快樂。另外,如果你最近想跳槽的話,年前我花了2周時(shí)間收集了一波大廠面經(jīng),節(jié)后準(zhǔn)備跳槽的可以 點(diǎn)擊這里領(lǐng)取 !
推薦閱讀
··································你好,我是 JavaPub,多年開發(fā)老司機(jī),區(qū)塊鏈從業(yè)者、自媒體創(chuàng)作者、站長。喜歡自由、開放。選擇計(jì)算機(jī)這個(gè)行業(yè),就是因?yàn)闊釔?。一路過來,給我最深的感受就是一定要不斷學(xué)習(xí)并關(guān)注前沿。只要你能堅(jiān)持下來,多思考、少抱怨、勤動(dòng)手,就很容易實(shí)現(xiàn)彎道超車!所以,不要問我現(xiàn)在干什么是否來得及。如果你看好一個(gè)事情,一定是堅(jiān)持了才能看到希望,而不是看到希望才去堅(jiān)持。相信我,只要堅(jiān)持下來,你一定比現(xiàn)在更好!如果你還沒什么方向,可以先關(guān)注我,這里會(huì)經(jīng)常分享一些前沿資訊,幫你積累彎道超車的資本。
評論
圖片
表情
