Go 1.22中的for循環(huán)新特性詳解
在 Go 語言中,for 循環(huán)是實(shí)現(xiàn)迭代的主要方式。Go 中的 for 循環(huán)非常靈活,有多種使用方式,包括傳統(tǒng)的三部分 for 循環(huán)、類似于其他語言中的 while 循環(huán)以及迭代集合的 range 循環(huán)。
在 1.22 之前的版本中,for 循環(huán)的變量只創(chuàng)建一次,在每個迭代中為這個變量賦予對應(yīng)的值。由于這個特性,使用起來很容易犯錯,一不小心就會導(dǎo)致意想不到的行為??慈缦率纠?/p>
package main import ( "fmt" "time" ) func main() { s := []string{"a", "b"} for _, v := range s { go func() { fmt.Print(v) }() } time.Sleep(time.Second * 1) }
這個示例結(jié)果一般都會輸出 bb,而并非預(yù)期中的 ab 或 ba。for 循環(huán)遍歷 s 切片,每次迭代中都啟動一個新的 goroutine 來打印變量 v 的值。由于 goroutine 是并發(fā)執(zhí)行的,并且 for 循環(huán)不會等待它們完成。由于 for 循環(huán)的迭代速度非???,當(dāng) goroutine 啟動時,都共享了循環(huán)變量 v 的同一個實(shí)例,而不是在每次迭代時捕獲 v 的值。當(dāng)這些 goroutine 最終執(zhí)行時,循環(huán)變量 v 的值大多數(shù)情況下已經(jīng)變成了循環(huán)的最后一個值 b。但是由于并發(fā)的性質(zhì),實(shí)際的輸出可能會有所不同。
當(dāng)然可以通過其他寫法來避免這個問題,每次可以額外使用一個新的變量來承接,示例代碼如下:
package main import ( "fmt" "time" ) func main() { s := []string{"a", "b"} for _, v := range s { newV := v go func() { fmt.Print(newV) }() } time.Sleep(time.Second * 1) }
也可以使用通過給閉包函數(shù)傳參的方式,示例代碼如下:
package main import ( "fmt" "time" ) func main() { s := []string{"a", "b"} for _, v := range s { go func(v string) { fmt.Print(v) }(v) } time.Sleep(time.Second * 1) }
這兩種方式都略顯繁瑣。有了這個知識背景,接下來看下 Go 1.22 中 for 循環(huán)的第一個變化。
每次迭代都創(chuàng)建新變量
在 Go 1.22 中,for 循環(huán)的每次迭代都會創(chuàng)建新變量,這將會避免上文示例中的問題。還是按照第一個代碼示例執(zhí)行一次,代碼如下:
package main import ( "fmt" "time" ) func main() { s := []string{"a", "b"} for _, v := range s { go func() { fmt.Print(v) }() } time.Sleep(time.Second * 1) }
可以發(fā)現(xiàn)這段代碼不再輸出 bb 而是輸出了預(yù)期中的 ab 或者 ba。因?yàn)槊看蔚紩?chuàng)建新變量 v,所以每個閉包都持有對不同 v 變量的引用,因此,輸出了預(yù)期的結(jié)果。循環(huán)的每次迭代都會創(chuàng)建新變量的這一更新,提高了代碼的安全性和可預(yù)測性。接下來看下 Go 1.22 中 for 循環(huán)的第二個變化。
支持整數(shù)類型循環(huán)
在 Go 1.22 之前,for range 循環(huán)支持 array、slice、string、map 和 channel 類型的表達(dá)式。從 1.22 開始,新增了對整數(shù)類型表達(dá)式的支持。這意味著可以直接使用整數(shù)進(jìn)行循環(huán),例如如下代碼示例,將迭代從 0 到 2 的整數(shù)。
package main import "fmt" func main() { for i := range 3 { fmt.Println(i) } }
這種寫法在 1.22 之前的版本會報錯。
小結(jié)
這兩項(xiàng)更新顯著提高了 Go 語言在編寫循環(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中Context的三個常見應(yīng)用場景
Golang?context主要用于定義超時取消,取消后續(xù)操作,在不同操作中傳遞值。本文通過簡單易懂的示例進(jìn)行說明,感興趣的可以了解一下2022-12-12golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門
這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09深入理解Golang中的Protocol Buffers及其應(yīng)用
本篇文章將深入探討 Go 語言中使用 Protobuf 的基礎(chǔ)知識、常見應(yīng)用以及最佳實(shí)踐,希望能幫大家了解如何在項(xiàng)目中高效利用 Protobuf2024-11-11