自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

快看! Go 1.22 對for循環(huán)進(jìn)行了兩個大更新

開發(fā) 前端
Go1.22之前版本for 循環(huán)聲明的變量只創(chuàng)建一次,并在每次迭代中進(jìn)行更新,這會導(dǎo)致遍歷時訪問value時實際上都是訪問的同一個地址的值。

Go 1.22 版本于 2024 年 2 月 6 日正式向世界宣告了版本的發(fā)布 。

我們可以從官網(wǎng)下載1.22版本進(jìn)行體驗,或者從 Go Playground上進(jìn)行體驗最新語法

圖片圖片

值得注意的是在語言層面上,這個版本對 for 循環(huán)進(jìn)行了兩處更新:

  • ? for循環(huán)的每次迭代都會定義新變量,而不再是共享一個變量
  • ? 支持對整數(shù)范圍進(jìn)行循環(huán)迭代

今天將以案例的方式對比下最新版本 for 循環(huán)的兩個更新點。

?? Let's Go!

循環(huán)不再共享循環(huán)變量

?? for在循環(huán)語義層面的坑

Go1.22之前版本for 循環(huán)聲明的變量只創(chuàng)建一次,并在每次迭代中進(jìn)行更新,這會導(dǎo)致遍歷時訪問value時實際上都是訪問的同一個地址的值。

相信不少小伙伴都遇到過,特別是在初學(xué)Go的時候!

Go1.22之前版本

我們用官博文章中那個例子,稍微改進(jìn)如下,并使用1.21版本運行

package main

import "fmt"

func main() {
    done := make(chan bool)

    values := []string{"xiao", "xu", "code"}
    for _, v := range values {
        go func() {
            fmt.Println(v)
            done <- true
        }()
    }

    // 等待所有的 goroutine 執(zhí)行結(jié)束
    for _ = range values {
        <-done
    }
}

上述代碼運行結(jié)果如下所示:

code
code
code

這三個創(chuàng)建的 goroutine 都在打印同一個變量 v,所以它們通常會打印出 "code"、"code"、"code",而不是以某種順序打印出 "xiao"、"xu" 和 "code"。

?? 這就是共享循環(huán)變量造成的問題!

這個比較好理解,這個循環(huán)的 v 只創(chuàng)建一次,在每次循環(huán)的時候都會更新,而 閉包在訪問 v 時實際上都訪問的是同一個內(nèi)存地址,所以最終打印的都是同一個值。

解決辦法:

在Go版本不變的情況下,可以通過下面兩種方式修改代碼避免這個問題。

1:將for循環(huán)中傳入v,代碼改造如下

values := []string{"xiao", "xu", "code"}
for _, v := range values {
    go func(v string) {
        fmt.Println( v)
        done <- true
    }(v)
}

2:在循環(huán)中重新定義一個變量進(jìn)行再次賦值

values := []string{"xiao", "xu", "code"}
for _, v := range values {
    value := v
    go func() {
        fmt.Println( value)
        done <- true
    }()
}

Go1.22版本

不過這個問題在1.22版本已經(jīng)得到處理了,大家用這個版本的時候可以放心使用了,太爽了吧!

我們在1.22版本上運行和1.21一樣的代碼

package main

import "fmt"

func main() {
    done := make(chan bool)

    values := []string{"xiao", "xu", "code"}
    for _, v := range values {
        go func() {
            fmt.Println(v)
            done <- true
        }()
    }

    // 等待所有的 goroutine 執(zhí)行結(jié)束
    for _ = range values {
        <-done
    }
}

上述代碼運行結(jié)果如下所示:

code
xiao
xu

for 循環(huán)的每次迭代都會創(chuàng)建新變量,每次循環(huán)迭代各自的變量,以避免意外共享錯誤。上面一模一樣的代碼,輸出結(jié)果不再是固定的 code。

支持整數(shù)范圍進(jìn)行循環(huán)迭代

在 Go 1.22 版本之前, for range 僅支持對 array or slice、string、map 和 channel 類型的進(jìn)行迭代。

而自 Go 1.22 版本起,新增了整數(shù)類型的迭代支持,我們能夠直接使用整數(shù)進(jìn)行循環(huán)迭代。

下面同樣列舉不同版本的例子,看看差異性!

Go1.22之前版本

package main

import "fmt"

func main() {
    for i := range 5 {
        fmt.Println("小許code", i)
    }
}

不支持遍歷整數(shù)范圍,這個range 5就直接提示報錯了,編譯當(dāng)然有問題了

.\main.go:15:17: cannot range over 5 (untyped int constant)

Go1.22版本

package main

import "fmt"

func main() {
    for i := range 5 {
        fmt.Println("小許code", i)
    }
}

上述代碼運行結(jié)果如下所示:

小許code 0
小許code 1
小許code 2
小許code 3
小許code 4

今天關(guān)于Go 1.22關(guān)于for循環(huán)的更新就介紹到這了,是不是覺得這個更新太棒啦!

注意了,面試的同學(xué),如果沒有指定說明版本的話,還是需要注意下調(diào)整回之前的答案!

責(zé)任編輯:武曉燕 來源: 小許code
相關(guān)推薦

2023-10-08 16:22:37

XGBoost算法

2021-08-04 11:02:50

以色列政府勒索軟件網(wǎng)絡(luò)攻擊

2024-09-02 11:53:15

2020-08-03 10:18:05

CIO首席信息官數(shù)字化

2021-10-19 11:49:01

釣魚詐騙DoT美國交通部

2010-09-16 15:54:19

2022-09-03 11:58:23

網(wǎng)絡(luò)入侵勒索軟件

2024-01-22 00:30:00

Go編程Go 1.22

2022-01-17 14:56:34

網(wǎng)絡(luò)攻擊黑客網(wǎng)絡(luò)安全

2023-03-09 14:16:00

AIChatGPT

2024-10-11 12:56:20

2023-11-30 07:18:55

2021-04-15 21:57:49

Windows 10Windows微軟

2020-02-05 09:30:14

技術(shù)研發(fā)指標(biāo)

2022-04-04 18:20:58

AI架構(gòu)應(yīng)用

2022-03-12 14:33:22

Web 開發(fā)者Defender安全防護(hù)

2023-09-25 08:08:56

CAA開發(fā)者團(tuán)隊

2022-02-07 15:05:07

模型AI訓(xùn)練

2022-01-17 12:06:43

人工智能AI深度學(xué)習(xí)
點贊
收藏

51CTO技術(shù)棧公眾號