Go語言for range 按照鍵值迴圈 遍歷操作

2022-09-22 01:15:07 字數 3225 閱讀 7324

go 語言可以使用 for range 遍歷陣列、切片、字串、map 及通道(channel)。通過 for range 遍歷的返回值有一定的規律:

陣列、切片、字串返回索引和值。

map 返回鍵和值。

通道(channel)只返回通道內的值。

遍歷陣列、切片——獲得索引和元素

在遍歷**中,key 和 value 分別代表切片的下標及下標對應的值。下面的**展示如何遍歷切片,陣列也是類似的遍歷方法:

for key, value := range int

**輸出如下:

key:0 value:1

key:1 value:2

key:2 value:3

key:3 value:4

遍歷字串——獲得字元

go 語言和其他語言類似,可以通過 for range 的組合,對字串進行遍歷,遍歷時,key 和 value 分別代表字串的索引(base0)和字串中的每乙個字元。

下面這段**展示了如何遍歷字串:

var str = "hlrfpprhoiello 你好"

for key, value := range str

**輸出如下:

key:0 value:0x68

key:1 value:0x65

key:2 value:0x6c

key:3 value:0x6c

key:4 value:0x6f

key:5 value:0x20

key:6 value:0x4f60

key:9 value:0x597d

**中的 v 變數,實際型別是 rune,實際上就是 int32,以十六進製制列印出來就是字元的編碼。

遍歷map——獲得map的鍵和值

對於 map 型別來說,for range 遍歷時,key 和 value 分別代表 map 的索引鍵 key 和索引對應的值,一般被稱為 map 的鍵值對,因為它們總是一對一對的出現。下面的程式設計客棧**演示了如何遍歷 map。

m := map[string]int

for key, value := range m

**輸出如下:

hello 100

world 200

注意對 map 遍歷時,遍歷輸出的鍵值是無序的,如果需要有序的鍵值對輸出,需要對結果進行排序。

遍歷通道(channel)——接收通道資料

for range 可以遍歷通道(channel),但是通道在遍歷時,只輸出乙個值,即管道內的型別對應的資料。

下面**為我們展示了通道的遍歷:

c := make(chan int)

go func()

for _, value := range m

**輸出如下:

在例子中將 key 變成了下畫線,那麼這裡的下畫線就是匿名變數。什麼是匿名變數?

可以理解為一種佔位符。

本身這種變數不會進行空間分配,也不會占用乙個變數的名字。

在 for range 可以對 key 使用匿名變數,也可以對 value 使用匿名變數。

再看乙個匿名變數的例子:

for key, _ := range int

**輸出如下:

key:0

key:1

key:2

key:3

在該例子中,value 被設定為匿名變數,只使用 key,而 key 本身就是切片的索引,所以例子輸出索引。

我們總結一下for的功能:

go 語言的 for 包含初始化語句、條件表示式、結束語句,這 3 個部分均可預設。

for range 支援對陣列、切片、字串、map、通道進行遍歷操作。

在需要時,可以使用匿名變數對 for range 的變數進行選取。

補充:學習-go語言坑之fo程式設計客棧r range

go只提供了一種迴圈方式,即for迴圈,在使用時可以像c那樣使用,也可以通過for range方式遍歷容器型別如陣列、切片和對映。但是在使用for range時,如果使用不當,就會出現一些問題,導致程式執行行為不如預期。比如,下面的示例程式將遍歷乙個切片,並將切片的值當成對映的鍵和值存入,切片型別是乙個int型,對映的型別是鍵為int型,值為*int,即值是乙個位址。

package main

import "fmt"

func main()

mymap := make(map[int]*int)

for index, value := range slice

fmt.println("*****new map*****")

prtmap(mymap)}

func prtmap(mymap map[int]*int)

}執行程式輸出如下:

*****new map*****

map[3]=3

map[0]=3

map[1]=3

map[2]=3

由輸出可以知道,不是我們預期的輸出,正確輸出應該如下:

*****new map*****

map[0]=0

map[1]=1

map[2]=2

map[3]=3

但是由輸出可以知道,對映的值都相同且都是3。其實可以猜測對映的值都是同乙個位址,遍歷到切片的最後乙個元素3時,將3寫入了該位址,所以導致對映所有值都相同。

其實真實原因也是如此,因為for range建立了每個元素的副本,而不是直接返回每個元素的引用,如果使用該值變數的位址作為指向每個元素的指標,就會導致錯誤,在迭代時,返回的變數是乙個迭代過程中根據切片依次賦值的新變數,所以值的位址總是相同的,導致結果不如預期。

修正後程式如下:

package main

import "fmt"

func main()

mymap := make(map[int]*int)

for index, value := range slice

fmt.println("*****new map*****")

prtmap(mymap)

}lrfpprhoi

func prtmap(mymap map[int]*int)

}執行程式輸出如下:

*****new map*****

map[2]=2

map[3]=3

map[0]=0

map[1]=1

本文標題: go語言for range(按照鍵值迴圈)遍歷操作

本文位址:

Go語言for range(按照鍵值迴圈)遍歷

go 語言可以使用 for range 遍歷陣列 切片 字串 map 及通道 channel 通過 for range 遍歷的返回值有一定的規律 陣列 切片 字串返回索引和值。map 返回鍵和值。通道 channel 只返回通道內的值。遍歷陣列 切片 獲得索引和元素 在遍歷 中,key 和 valu...

go語言坑之for range

songleo 關注 go只提供了一種迴圈方式,即for迴圈,在使用時可以像c那樣使用,也可以通過for range方式遍歷容器型別如陣列 切片和對映。但是在使用for range時,如果使用不當,就會出現一些問題,導致程式執行行為不如預期。比如,下面的示例程式將遍歷乙個切片,並將切片的值當成對映的...

go語言for range 鍵值迴圈

go 語言可以使用 for range 遍歷陣列 切片 字串 map 及通道 channel 通過 for range 遍歷的返回值有一定的規律 for key,value range intgo 語言和其他語言類似,可以通過 for range 的組合,對字串進行遍歷,遍歷時,key 和 valu...