GO的range具體使用
GO 語(yǔ)言的 for…range 能做什么呢?
for…range 如何使用 ?
for…range 的返回值有哪些情況,可以對(duì)于任何數(shù)據(jù)結(jié)構(gòu)使用嗎?
for…range 的返回值如果不需要,可以如何處理?
for…range 的數(shù)據(jù)是如何傳遞的?
剛學(xué)習(xí) golang 的 xdm 會(huì)不會(huì)有上面的疑問(wèn)?其實(shí)很簡(jiǎn)單,我們就一個(gè)一個(gè)的來(lái)分享和實(shí)操一遍
GO 語(yǔ)言的 for…range 能做什么呢?
golang 的 for…range 是 go 自身的語(yǔ)法,可以用來(lái)遍歷數(shù)據(jù)結(jié)構(gòu),有如下數(shù)據(jù)結(jié)構(gòu)可以遍歷
- 切片 slice
- 數(shù)組 array
- map 哈希表
- channel 通道
for…range 如何使用 ?
我們分別來(lái)看看可以如何使用他們,for…range 相當(dāng)于一個(gè)迭代器,可以遍歷數(shù)據(jù)結(jié)構(gòu)的鍵/索引 和值
數(shù)組 array
初始化一個(gè)數(shù)組
使用 for…range 遍歷 , 對(duì)應(yīng)的是 索引 和 值
func main() {
myArray := [5]int{1, 2, 3, 4, 5}
for i, v := range myArray {
fmt.Printf("%d -- %d -- %p\n", i, v, &v)
}
}
切片 slice
初始化一個(gè)切片
使用 for…range 遍歷 , 對(duì)應(yīng)的是 索引 和 值
mySlice := []int{1, 2, 3, 4, 5}
for i, v := range mySlice {
fmt.Printf("%d -- %d -- %p\n", i, v, &v)
}
map 哈希表
- 初始化一個(gè) map 哈希表
- 使用 for…range 遍歷 , map 對(duì)應(yīng)的 鍵值對(duì)
myMap := map[string]string{
"name": "xmt",
"hobby": "program",
"addr": "mengli",
}
for k, v := range myMap {
fmt.Printf("%s -- %s -- %p\n", k, v, &v)
}
channel 通道
- 創(chuàng)建一個(gè)可以緩沖 10 個(gè) int 類(lèi)型數(shù)據(jù)的通道
- 創(chuàng)建一個(gè)協(xié)程專(zhuān)門(mén)向通道中寫(xiě)入數(shù)據(jù)
- 主協(xié)程遍歷通道,讀取數(shù)據(jù)
package main
import "fmt"
var myCh = make(chan int, 10)
func writeCh() {
for i := 0; i < 5; i++ {
myCh <- i
}
close(myCh)
}
func main() {
go writeCh()
for {
for data := range myCh {
fmt.Println(data)
}
break
}
}
for…range 的返回值有哪些情況,可以對(duì)于任何數(shù)據(jù)結(jié)構(gòu)使用嗎?
并不是所有數(shù)據(jù)結(jié)構(gòu)都可以使用 for…range 的,如下結(jié)構(gòu)可以使用這個(gè)方法
| 返回值 1 | 返回值 2 | 數(shù)據(jù)傳遞 | |
|---|---|---|---|
| 字符串 | 索引 | 索引對(duì)應(yīng)的值 | 值傳遞 |
| 數(shù)組或者切片 | 索引 | 索引對(duì)應(yīng)的值 | 數(shù)組:值傳遞 切片:引用傳遞 |
| 哈希表 | 鍵 | 鍵對(duì)應(yīng)的值 | 指針 |
| 通道 | 通道中的數(shù)據(jù) | 指針 |
for…range 的返回值如果不需要,可以如何處理?
相信寫(xiě)過(guò) golang 的 xdm 都知道,go 里面對(duì)于我們不需要的返回值,都可以使用 - 來(lái)表示 ,因此 for…range 當(dāng)然也可以這樣
例如:
myMap := map[string]string{
"name": "xmt",
"hobby": "program",
"addr": "mengli",
}
for _, v := range myMap {
fmt.Printf("%s -- %p\n", v, &v)
}
for…range 的數(shù)據(jù)是如何傳遞的?
數(shù)據(jù)都是通過(guò)復(fù)制傳遞的,也就是都是值傳遞的,只不過(guò)由于數(shù)據(jù)結(jié)構(gòu)不一樣,數(shù)組和切片在這里還是有一些區(qū)別的
前面的文章,我們有說(shuō)到,切片,對(duì)應(yīng)著 有 3 個(gè)元素的數(shù)據(jù)結(jié)構(gòu),一個(gè)是 cap,一個(gè)是 len, 一個(gè)是 ptr ,指向的是一個(gè)底層數(shù)組
切片是引用傳遞,但是傳遞數(shù)據(jù)的時(shí)候,切片這個(gè)變量是值傳遞,但是它實(shí)際指向的底層數(shù)組還是不會(huì)變的
咱們來(lái)寫(xiě)一個(gè) demo 查看一下:
我們思路是這個(gè)樣子:
遍歷一個(gè) 數(shù)組/切片,在遍歷當(dāng)前值的時(shí)候,去修改后面索引對(duì)應(yīng)的值,全部遍歷完畢后,查看結(jié)果中,實(shí)際的數(shù)據(jù)是否會(huì)被修改掉,若修改掉了,則是切片是傳引用,若沒(méi)有修改掉,則是數(shù)組是傳值
數(shù)組的效果
myArray := [5]int{1, 2, 3, 4, 5}
fmt.Println(myArray)
for i, v := range myArray {
if i == 0{
myArray[2] = 888
}
fmt.Printf("%d -- %d -- %p\n", i, v, &myArray[i])
}
效果如下:
go run main.go
[1 2 3 4 5]
0 -- 1 -- 0x1189c120
1 -- 2 -- 0x1189c124
2 -- 3 -- 0x1189c128
3 -- 4 -- 0x1189c12c
4 -- 5 -- 0x1189c130
切片的效果
mySlice := []int{1, 2, 3, 4, 5}
fmt.Println(mySlice)
for i, v := range mySlice {
if i == 0{
mySlice[2] = 888
}
fmt.Printf("%d -- %d -- %p\n", i, v, &mySlice[i])
}
效果如下:
go run main.go
[1 2 3 4 5]
0 -- 1 -- 0x1140e340
1 -- 2 -- 0x1140e344
2 -- 888 -- 0x1140e348
3 -- 4 -- 0x1140e34c
4 -- 5 -- 0x1140e350
通過(guò)上述的案例,相信心里都有點(diǎn)譜了吧
到此這篇關(guān)于GO的range具體使用的文章就介紹到這了,更多相關(guān)GO range內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang之判斷元素是否在數(shù)組內(nèi)問(wèn)題
這篇文章主要介紹了golang之判斷元素是否在數(shù)組內(nèi)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2020-12-12
源碼剖析Golang中map擴(kuò)容底層的實(shí)現(xiàn)
之前的文章詳細(xì)介紹過(guò)Go切片和map的基本使用,以及切片的擴(kuò)容機(jī)制。本文針對(duì)map的擴(kuò)容,會(huì)從源碼的角度全面的剖析一下map擴(kuò)容的底層實(shí)現(xiàn),需要的可以參考一下2023-03-03
解決vscode中g(shù)olang插件依賴(lài)安裝失敗問(wèn)題
這篇文章主要介紹了解決vscode中g(shù)olang插件依賴(lài)安裝失敗問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Go 并發(fā)讀寫(xiě) sync.map 詳細(xì)
閱讀本文你將會(huì)明確 sync.Map 和原生 map +互斥鎖/讀寫(xiě)鎖之間的性能情況。標(biāo)準(zhǔn)庫(kù) sync.Map 雖說(shuō)支持并發(fā)讀寫(xiě) map,但更適用于讀多寫(xiě)少的場(chǎng)景,因?yàn)樗麑?xiě)入的性能比較差,使用時(shí)要考慮清楚這一點(diǎn)。2021-10-10
golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)
這篇文章主要介紹了golang切片擴(kuò)容規(guī)則實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
詳解如何在Golang中監(jiān)聽(tīng)多個(gè)channel
這篇文章主要為大家詳細(xì)介紹了如何在Golang中實(shí)現(xiàn)監(jiān)聽(tīng)多個(gè)channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn)詳解
這篇文章主要為大家詳細(xì)介紹了golang使用sync.Once實(shí)現(xiàn)懶加載的用法和坑點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Go語(yǔ)言學(xué)習(xí)之接口類(lèi)型(interface)詳解
接口是用來(lái)定義行為的類(lèi)型,定義的行為不由接口直接實(shí)現(xiàn),而由通過(guò)方法由定義的類(lèi)型實(shí)現(xiàn),本文就來(lái)和大家詳細(xì)講講Go語(yǔ)言中接口的使用吧2023-03-03

