亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2024年02月25日 15:04:33   作者:路多辛  
在 Go 語言中,for 循環(huán)是實現迭代的主要方式,Go 中的 for 循環(huán)非常靈活,有多種使用方式,本文將給大家詳細的介紹一下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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言編譯時為exe添加圖標和屬性信息的方法

    Go語言編譯時為exe添加圖標和屬性信息的方法

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

    一文帶你了解Go語言中的匿名函數

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

    詳解Golang中Context的三個常見應用場景

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

    Go語言Cookie用法分析

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

    在goland中配置gofmt的操作

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

    Go基于雪花算法生成隨機id

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

    go?閉包case示例代碼

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

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

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

    go實現redigo的簡單操作

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

    深入理解Golang中的Protocol Buffers及其應用

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

最新評論