Golang迭代如何在Go中循環(huán)數(shù)據(jù)結(jié)構(gòu)使用詳解
引言
數(shù)組是存儲(chǔ)類似類型數(shù)據(jù)的強(qiáng)大數(shù)據(jù)結(jié)構(gòu)。您可以通過(guò)索引識(shí)別和訪問(wèn)其中的元素。
在Golang中,您可以通過(guò)在0初始化變量i并增加變量直到它達(dá)到數(shù)組的長(zhǎng)度,使用for
循環(huán)循環(huán)數(shù)組。
它們的語(yǔ)法如下所示:
for i := 0; i < len(arr); i++ { // perform an operation }
例如,讓我們循環(huán)一個(gè)整數(shù)數(shù)組:
package main import ( "fmt" ) func main() { numbers := []int{7, 9, 1, 2, 4, 5} for i := 0; i < len(numbers); i++ { fmt.Println(numbers[i]) } }
在上面的代碼中,我們定義了一個(gè)名為numbers
的整數(shù)數(shù)組,并通過(guò)初始化變量i
循環(huán)它們。然后,我們?cè)谠黾?code>i的同時(shí)打印出數(shù)組每個(gè)索引的值。
上面的代碼輸出如下:
7
9
1
2
4
5
我們還可以使用range
關(guān)鍵字循環(huán)數(shù)組,該關(guān)鍵字迭代數(shù)組的整個(gè)長(zhǎng)度。
語(yǔ)法如下所示:
for index, arr := range arr { // perform an operation }
例如:
package main import ( "fmt" ) func main() { arr := []string{"a", "b", "c", "d", "e", "f"} for index, a := range arr { fmt.Println(index, a) } }
在上面的代碼中,我們定義了一個(gè)字符串?dāng)?shù)組,并使用for..range
關(guān)鍵字循環(huán)其索引和值。
for...range
的語(yǔ)法更簡(jiǎn)單,更容易理解。您使用它來(lái)迭代不同的數(shù)據(jù)結(jié)構(gòu),如數(shù)組、字符串、映射、切片等。
這輸出以下內(nèi)容:
0 a
1 b
2 c
3 d
4 e
5 f
假設(shè)我們忽略索引并簡(jiǎn)單地打印出數(shù)組的元素,您只需將index
變量替換為下劃線即可。
例如:
package main import ( "fmt" ) func main() { arr := []string{"a", "b", "c", "d", "e", "f"} for _, a := range arr { fmt.Println(a) } }
在上面的代碼中,我們修改了前面的示例,并將index
變量替換為下劃線。我們這樣做是為了忽略索引,而是輸出數(shù)組的元素。
這輸出以下內(nèi)容:
a
b
c
d
e
f
如何在Go中循環(huán)字符串
編程中的字符串是不可變的——這意味著您在創(chuàng)建它們后無(wú)法修改它們。它們是一個(gè)或多個(gè)字符(如字母、數(shù)字或符號(hào))的有序序列,可以是常數(shù)或變量。
在Golang中,字符串與Python或JavaScript等其他語(yǔ)言不同。它們表示為UTF-8字節(jié)序列,字符串中的每個(gè)元素都表示一個(gè)字節(jié)。
您使用for...range
循環(huán)或使用常規(guī)循環(huán)循環(huán)字符串。
例如:
package main import ( "fmt" ) func main() { word := "Ab$du" for index, a := range word { fmt.Println(index, string(a)) } }
在上面的代碼中,我們定義了一個(gè)包含不同字符的字符串,并循環(huán)了其條目。字符串在Golang中表示為字節(jié),這就是為什么在打印出來(lái)時(shí),我們需要將每個(gè)值轉(zhuǎn)換為類型string
。
此輸出:
0 A
1 b
2 $
3 d
4 u
如果我們沒(méi)有將每個(gè)條目轉(zhuǎn)換為字符串,Golang會(huì)打印出字節(jié)表示形式。
例如:
package main import ( "fmt" ) func main() { word := "Ab$du" for index, a := range word { fmt.Println(index, a) } }
結(jié)果:
0 65
1 98
2 36
3 100
4 117
我們還可以通過(guò)使用常規(guī)for loop
來(lái)迭代字符串。
package main import ( "fmt" ) func main() { word := "ab$du" for i := 0; i < len(word); i++ { fmt.Println(i, string(word[i])) } }
如何在Go中循環(huán)map結(jié)構(gòu)
在Golang中,映射是一種將元素存儲(chǔ)在鍵值對(duì)中的數(shù)據(jù)結(jié)構(gòu),其中鍵用于識(shí)別地圖中的每個(gè)值。它類似于Python和Java等其他語(yǔ)言中的字典和哈希圖。
您可以使用 for...range
語(yǔ)句在 Golang 中迭代map
,其中它獲取索引及其相應(yīng)值。
例如:
package main import ( "fmt" ) func main() { books := map[string]int{ "maths": 5, "biology": 9, "chemistry": 6, "physics": 3, } for key, val := range books { fmt.Println(key, val) } }
在上面的代碼中,我們定義了一個(gè)地圖,存儲(chǔ)以類型string
為鍵,類型int
作為其值的書(shū)店的詳細(xì)信息。然后,我們使用for..range
關(guān)鍵字循環(huán)瀏覽其鍵和值。
在Golang中迭代地圖沒(méi)有任何指定的順序,我們不應(yīng)該期望按我們循環(huán)時(shí)定義的順序返回密鑰。
此代碼輸出:
physics 3
maths 5
biology 9
chemistry 6
如果我們不想指定值而只返回鍵,我們根本不定義值變量,而只定義鍵變量。
例如:
package main import ( "fmt" ) func main() { books := map[string]int{ "maths": 5, "biology": 9, "chemistry": 6, "physics": 3, } for key := range books { fmt.Println(key) } }
這輸出以下內(nèi)容:
maths
biology
chemistry
physics
同樣,如果我們對(duì)地圖的鍵不感興趣,我們使用下劃線來(lái)忽略鍵并為值定義變量。
例如:
package main import ( "fmt" ) func main() { books := map[string]int{ "maths": 5, "biology": 9, "chemistry": 6, "physics": 3, } for _, val := range books { fmt.Println(val) } }
此輸出:
5
9
6
3
如何在Go中循環(huán)Struct
Struct是Golang中的一種數(shù)據(jù)結(jié)構(gòu),用于將不同的數(shù)據(jù)類型組合成一個(gè)。與數(shù)組不同,結(jié)構(gòu)可以包含整數(shù)、字符串、布爾值等——所有這些都集中在一個(gè)地方。
與地圖不同,我們可以輕松地循環(huán)其鍵和值,在Golang中循環(huán)結(jié)構(gòu)需要您使用稱為reflect
的軟件包。這允許我們您修改具有任意類型的對(duì)象。
例如,讓我們創(chuàng)建一個(gè)結(jié)構(gòu)并循環(huán)它:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int Gender string Single bool } func main() { ubay := Person{ Name: "John", Gender: "Female", Age: 17, Single: false, } values := reflect.ValueOf(ubay) types := values.Type() for i := 0; i < values.NumField(); i++ { fmt.Println(types.Field(i).Index[0], types.Field(i).Name, values.Field(i)) } }
此輸出:
0 Name John
1 Age 17
2 Gender Female
3 Single false
在上面的代碼中,我們定義了一個(gè)名為Person
的struct
,具有不同的屬性,并創(chuàng)建了該struct
的新實(shí)例。然后,我們使用reflect
包來(lái)獲取struct
及其type
值。
通過(guò)使用正則for
循環(huán),我們?cè)黾映跏蓟兞?code>i,直到它達(dá)到結(jié)構(gòu)的長(zhǎng)度。
我們使用NumField
方法來(lái)獲取結(jié)構(gòu)中的字段總數(shù)。types.Field(i).Index
方法返回結(jié)構(gòu)中每個(gè)鍵的索引。types.Field(i).Name
方法返回結(jié)構(gòu)中每個(gè)鍵的字段名。和values.Field(i)
返回結(jié)構(gòu)中每個(gè)鍵的值。
結(jié)論
在本文中,我們探討了如何在Golang中對(duì)不同的數(shù)據(jù)類型進(jìn)行迭代,更多關(guān)于Golang 迭代循環(huán)數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 淺析Go語(yǔ)言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的
- Golang對(duì)struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐
- Go數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆
- Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解
- 詳解如何在Go語(yǔ)言中循環(huán)數(shù)據(jù)結(jié)構(gòu)
- Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)可視化詳解
- Go 數(shù)據(jù)結(jié)構(gòu)之堆排序示例詳解
- Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法
相關(guān)文章
一文掌握Golang的panic和recover實(shí)戰(zhàn)
Go語(yǔ)言中,異常處理通常依賴error返回值,本文將通過(guò)示例展示如何在Go語(yǔ)言中正確使用recover來(lái)處理panic異常,防止程序直接崩潰,感興趣的朋友跟隨小編一起看看吧2024-09-09Apache?IoTDB開(kāi)發(fā)系統(tǒng)之Go原生接口方法
這篇文章主要為大家介紹了?Apache?IoTDB開(kāi)發(fā)系統(tǒng)之Go原生接口方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09gorm golang 并發(fā)連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)的解決方法
今天小編就為大家分享一篇gorm golang 并發(fā)連接數(shù)據(jù)庫(kù)報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn)
這篇文章主要介紹了Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03SingleFlight模式的Go并發(fā)編程學(xué)習(xí)
這篇文章主要為大家介紹了SingleFlight模式的Go并發(fā)編程學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04Golang學(xué)習(xí)筆記(五):函數(shù)
這篇文章主要介紹了Golang學(xué)習(xí)筆記(五):函數(shù)的相關(guān)資料,本文講解了基本語(yǔ)法、多返回值及命名返回參數(shù)、參數(shù)傳遞:傳值與傳指針、參數(shù)傳遞:可變參數(shù)、匿名函數(shù)、函數(shù)作為值、類型等內(nèi)容,需要的朋友可以參考下2015-05-05