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

GO的range如何使用詳解

 更新時(shí)間:2023年02月10日 08:35:06   作者:阿兵云原生  
本文主要介紹了GO的range如何使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

GO 語言的 for…range 能做什么呢?

for…range 如何使用 ?

for…range 的返回值有哪些情況,可以對(duì)于任何數(shù)據(jù)結(jié)構(gòu)使用嗎?

for…range 的返回值如果不需要,可以如何處理?

for…range 的數(shù)據(jù)是如何傳遞的?

剛學(xué)習(xí) golang 的 xdm 會(huì)不會(huì)有上面的疑問?其實(shí)很簡(jiǎn)單,我們就一個(gè)一個(gè)的來分享和實(shí)操一遍

GO 語言的 for…range 能做什么呢?

golang 的 for…range 是 go 自身的語法,可以用來遍歷數(shù)據(jù)結(jié)構(gòu),有如下數(shù)據(jù)結(jié)構(gòu)可以遍歷

  • 切片 slice
  • 數(shù)組 array
  • map 哈希表
  • channel 通道

for…range 如何使用 ?

我們分別來看看可以如何使用他們,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 類型數(shù)據(jù)的通道
  • 創(chuàng)建一個(gè)協(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 的返回值如果不需要,可以如何處理?

相信寫過 golang 的 xdm 都知道,go 里面對(duì)于我們不需要的返回值,都可以使用 - 來表示 ,因此 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ù)都是通過復(fù)制傳遞的,也就是都是值傳遞的,只不過由于數(shù)據(jù)結(jié)構(gòu)不一樣,數(shù)組和切片在這里還是有一些區(qū)別的

前面的文章,我們有說到,切片,對(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ì)變的

咱們來寫一個(gè) demo 查看一下:

我們思路是這個(gè)樣子:

遍歷一個(gè) 數(shù)組/切片,在遍歷當(dāng)前值的時(shí)候,去修改后面索引對(duì)應(yīng)的值,全部遍歷完畢后,查看結(jié)果中,實(shí)際的數(shù)據(jù)是否會(huì)被修改掉,若修改掉了,則是切片是傳引用,若沒有修改掉,則是數(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

通過上述的案例,相信心里都有點(diǎn)譜了吧

到此這篇關(guān)于GO的range如何使用詳解的文章就介紹到這了,更多相關(guān)GO range使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Go語言多態(tài)的實(shí)現(xiàn)與interface使用

    淺談Go語言多態(tài)的實(shí)現(xiàn)與interface使用

    如果大家系統(tǒng)的學(xué)過C++、Java等語言以及面向?qū)ο蟮脑?,相信?yīng)該對(duì)多態(tài)不會(huì)陌生。多態(tài)是面向?qū)ο蠓懂牣?dāng)中經(jīng)常使用并且非常好用的一個(gè)功能,它主要是用在強(qiáng)類型語言當(dāng)中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實(shí)區(qū)別不是很大
    2021-06-06
  • golang?Gorm框架講解

    golang?Gorm框架講解

    gorm是一個(gè)使用Go語言編寫的ORM框架,這篇文章主要介紹了golang?Gorm框架,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    GO使用socket和channel實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)聊天室

    今天小編給大家分享一個(gè)簡(jiǎn)單的聊天室功能,聊天室主要功能是用戶可以加入離開聊天室,實(shí)現(xiàn)思路也很簡(jiǎn)單明了,下面小編給大家?guī)砹送暾a,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Golang對(duì)struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐

    Golang對(duì)struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐

    這篇文章主要為大家介紹了Golang對(duì)struct字段重新排序優(yōu)化數(shù)據(jù)結(jié)構(gòu)性能實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang中使用Date進(jìn)行日期格式化(沿用Java風(fēng)格)

    Golang中使用Date進(jìn)行日期格式化(沿用Java風(fēng)格)

    這篇文章主要介紹了Golang中使用Date進(jìn)行日期格式化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 一文秒懂Go 編寫命令行工具的代碼

    一文秒懂Go 編寫命令行工具的代碼

    這篇文章主要介紹了一文秒懂Go 編寫命令行工具的代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Go?runtime?調(diào)度器之系統(tǒng)調(diào)用引起的搶占

    Go?runtime?調(diào)度器之系統(tǒng)調(diào)用引起的搶占

    本文解析了在Go語言中,當(dāng)goroutine執(zhí)行的系統(tǒng)調(diào)用時(shí)間過長(zhǎng)時(shí),系統(tǒng)如何通過監(jiān)控和搶占機(jī)制來處理,以維持運(yùn)行效率和資源分配的平衡,通過具體的示例和流程圖,詳細(xì)展示了系統(tǒng)調(diào)用過程中的搶占操作,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Go中的gRPC入門教程詳解

    Go中的gRPC入門教程詳解

    本文詳細(xì)講解了Go中的gRPC入門教程,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • golang?中?recover()的使用方法

    golang?中?recover()的使用方法

    這篇文章主要介紹了Guam與golang??recover()的使用方法,Recover?是一個(gè)Go語言的內(nèi)建函數(shù),可以讓進(jìn)入宕機(jī)流程中的?goroutine?恢復(fù)過來,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • 詳解Golang中日志庫(kù)glog的使用

    詳解Golang中日志庫(kù)glog的使用

    golang/glog?是?C++?版本?google/glog?的?Go?版本實(shí)現(xiàn),基本實(shí)現(xiàn)了原生?glog?的日志格式,下面大家就跟隨小編一起了解一下glog的具體使用吧
    2023-09-09

最新評(píng)論