Go 1.22中的for循環(huán)新特性詳解
在 Go 語言中,for 循環(huán)是實現迭代的主要方式。Go 中的 for 循環(huán)非常靈活,有多種使用方式,包括傳統(tǒng)的三部分 for 循環(huán)、類似于其他語言中的 while 循環(huán)以及迭代集合的 range 循環(huán)。
在 1.22 之前的版本中,for 循環(huán)的變量只創(chuàng)建一次,在每個迭代中為這個變量賦予對應的值。由于這個特性,使用起來很容易犯錯,一不小心就會導致意想不到的行為。看如下示例:
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)
}這個示例結果一般都會輸出 bb,而并非預期中的 ab 或 ba。for 循環(huán)遍歷 s 切片,每次迭代中都啟動一個新的 goroutine 來打印變量 v 的值。由于 goroutine 是并發(fā)執(zhí)行的,并且 for 循環(huán)不會等待它們完成。由于 for 循環(huán)的迭代速度非??欤?goroutine 啟動時,都共享了循環(huán)變量 v 的同一個實例,而不是在每次迭代時捕獲 v 的值。當這些 goroutine 最終執(zhí)行時,循環(huán)變量 v 的值大多數情況下已經變成了循環(huán)的最后一個值 b。但是由于并發(fā)的性質,實際的輸出可能會有所不同。
當然可以通過其他寫法來避免這個問題,每次可以額外使用一個新的變量來承接,示例代碼如下:
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)
}也可以使用通過給閉包函數傳參的方式,示例代碼如下:
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ā)現這段代碼不再輸出 bb 而是輸出了預期中的 ab 或者 ba。因為每次迭代都會創(chuàng)建新變量 v,所以每個閉包都持有對不同 v 變量的引用,因此,輸出了預期的結果。循環(huán)的每次迭代都會創(chuàng)建新變量的這一更新,提高了代碼的安全性和可預測性。接下來看下 Go 1.22 中 for 循環(huán)的第二個變化。
支持整數類型循環(huán)
在 Go 1.22 之前,for range 循環(huán)支持 array、slice、string、map 和 channel 類型的表達式。從 1.22 開始,新增了對整數類型表達式的支持。這意味著可以直接使用整數進行循環(huán),例如如下代碼示例,將迭代從 0 到 2 的整數。
package main
import "fmt"
func main() {
for i := range 3 {
fmt.Println(i)
}
}這種寫法在 1.22 之前的版本會報錯。
小結
這兩項更新顯著提高了 Go 語言在編寫循環(huán)時的靈活性和安全性,有助于避免一些常見的編程錯誤和陷阱。
到此這篇關于Go 1.22中的for循環(huán)新特性詳解的文章就介紹到這了,更多相關Go 1.22 for循環(huán)新特性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang通用的grpc?http基礎開發(fā)框架使用快速入門
這篇文章主要為大家介紹了golang通用的grpc?http基礎開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
深入理解Golang中的Protocol Buffers及其應用
本篇文章將深入探討 Go 語言中使用 Protobuf 的基礎知識、常見應用以及最佳實踐,希望能幫大家了解如何在項目中高效利用 Protobuf2024-11-11

