欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go 1.22中的for循環(huán)新特性詳解

 更新時(shí)間:2024年02月25日 15:04:33   作者:路多辛  
在 Go 語言中,for 循環(huán)是實(shí)現(xiàn)迭代的主要方式,Go 中的 for 循環(huán)非常靈活,有多種使用方式,本文將給大家詳細(xì)的介紹一下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)建一次,在每個(gè)迭代中為這個(gè)變量賦予對(duì)應(yīng)的值。由于這個(gè)特性,使用起來很容易犯錯(cuò),一不小心就會(huì)導(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)
}

這個(gè)示例結(jié)果一般都會(huì)輸出 bb,而并非預(yù)期中的 ab 或 ba。for 循環(huán)遍歷 s 切片,每次迭代中都啟動(dòng)一個(gè)新的 goroutine 來打印變量 v 的值。由于 goroutine 是并發(fā)執(zhí)行的,并且 for 循環(huán)不會(huì)等待它們完成。由于 for 循環(huán)的迭代速度非???,當(dāng) goroutine 啟動(dòng)時(shí),都共享了循環(huán)變量 v 的同一個(gè)實(shí)例,而不是在每次迭代時(shí)捕獲 v 的值。當(dāng)這些 goroutine 最終執(zhí)行時(shí),循環(huán)變量 v 的值大多數(shù)情況下已經(jīng)變成了循環(huán)的最后一個(gè)值 b。但是由于并發(fā)的性質(zhì),實(shí)際的輸出可能會(huì)有所不同。

當(dāng)然可以通過其他寫法來避免這個(gè)問題,每次可以額外使用一個(gè)新的變量來承接,示例代碼如下:

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)
}

這兩種方式都略顯繁瑣。有了這個(gè)知識(shí)背景,接下來看下 Go 1.22 中 for 循環(huán)的第一個(gè)變化。

每次迭代都創(chuàng)建新變量

在 Go 1.22 中,for 循環(huán)的每次迭代都會(huì)創(chuàng)建新變量,這將會(huì)避免上文示例中的問題。還是按照第一個(gè)代碼示例執(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)槊看蔚紩?huì)創(chuàng)建新變量 v,所以每個(gè)閉包都持有對(duì)不同 v 變量的引用,因此,輸出了預(yù)期的結(jié)果。循環(huán)的每次迭代都會(huì)創(chuàng)建新變量的這一更新,提高了代碼的安全性和可預(yù)測(cè)性。接下來看下 Go 1.22 中 for 循環(huán)的第二個(gè)變化。

支持整數(shù)類型循環(huán)

在 Go 1.22 之前,for range 循環(huán)支持 array、slice、string、map 和 channel 類型的表達(dá)式。從 1.22 開始,新增了對(duì)整數(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 之前的版本會(huì)報(bào)錯(cuò)。

小結(jié)

這兩項(xiàng)更新顯著提高了 Go 語言在編寫循環(huán)時(shí)的靈活性和安全性,有助于避免一些常見的編程錯(cuò)誤和陷阱。

到此這篇關(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)文章

  • Go語言編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法

    Go語言編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法

    在使用Go語言開發(fā)應(yīng)用程序時(shí),有個(gè)非常方便的地方就是編譯得到的可執(zhí)行文件可以不依賴任何動(dòng)態(tài)鏈接庫、并且不需要任何運(yùn)行環(huán)境即可運(yùn)行,本文給大家介紹Go編譯時(shí)為exe添加圖標(biāo)和屬性信息的方法,需要的朋友可以參考下
    2023-09-09
  • 一文帶你了解Go語言中的匿名函數(shù)

    一文帶你了解Go語言中的匿名函數(shù)

    無論是在Go語言還是其他編程語言中,匿名函數(shù)都扮演著重要的角色,本文將詳細(xì)介紹Go語言中匿名函數(shù)的概念和使用方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • 詳解Golang中Context的三個(gè)常見應(yīng)用場(chǎng)景

    詳解Golang中Context的三個(gè)常見應(yīng)用場(chǎng)景

    Golang?context主要用于定義超時(shí)取消,取消后續(xù)操作,在不同操作中傳遞值。本文通過簡(jiǎn)單易懂的示例進(jìn)行說明,感興趣的可以了解一下
    2022-12-12
  • Go語言Cookie用法分析

    Go語言Cookie用法分析

    這篇文章主要介紹了Go語言Cookie用法,結(jié)合實(shí)例形式分析了Go語言Cookie的設(shè)置、讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • 在goland中配置gofmt的操作

    在goland中配置gofmt的操作

    這篇文章主要介紹了在goland中配置gofmt的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go基于雪花算法生成隨機(jī)id

    Go基于雪花算法生成隨機(jī)id

    雪花算法是twitter開源的由64位整數(shù)組成的分布式ID,本文主要介紹了Go基于雪花算法生成隨機(jī)id,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • go?閉包c(diǎn)ase示例代碼

    go?閉包c(diǎn)ase示例代碼

    這篇文章解釋了Go語言中匿名函數(shù)、閉包、立即執(zhí)行函數(shù)表達(dá)式(IIFE)和變量作用域的概念,它通過一個(gè)示例代碼展示了匿名函數(shù)如何捕獲并修改外部變量,以及如何使用立即執(zhí)行函數(shù)表達(dá)式來立即執(zhí)行這個(gè)匿名函數(shù),感興趣的朋友一起看看吧
    2025-02-02
  • golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門

    golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門

    這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • go實(shí)現(xiàn)redigo的簡(jiǎn)單操作

    go實(shí)現(xiàn)redigo的簡(jiǎn)單操作

    golang操作redis主要有兩個(gè)庫,go-redis和redigo,今天我們就一起來介紹一下redigo的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-07-07
  • 深入理解Golang中的Protocol Buffers及其應(yīng)用

    深入理解Golang中的Protocol Buffers及其應(yīng)用

    本篇文章將深入探討 Go 語言中使用 Protobuf 的基礎(chǔ)知識(shí)、常見應(yīng)用以及最佳實(shí)踐,希望能幫大家了解如何在項(xiàng)目中高效利用 Protobuf
    2024-11-11

最新評(píng)論