最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO的range具體使用

 更新時間:2021年10月27日 15:15:49   作者:小魔童哪吒  
GO語言的for…range 能做什么呢?golang的for…range是go 身的語法,可以用來遍歷數(shù)據(jù)結(jié)構(gòu),本文就詳細(xì)的來介紹一下具體使用,感興趣的可以了解一下

GO 語言的 for…range  能做什么呢?
for…range  如何使用 ?
for…range  的返回值有哪些情況,可以對于任何數(shù)據(jù)結(jié)構(gòu)使用嗎?
for…range  的返回值如果不需要,可以如何處理?
for…range  的數(shù)據(jù)是如何傳遞的?
剛學(xué)習(xí) golang 的 xdm 會不會有上面的疑問?其實很簡單,我們就一個一個的來分享和實操一遍

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)于一個迭代器,可以遍歷數(shù)據(jù)結(jié)構(gòu)的鍵/索引 和值

數(shù)組 array

初始化一個數(shù)組

使用 for…range 遍歷 , 對應(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

初始化一個切片
使用 for…range 遍歷 , 對應(yīng)的是 索引  和 值

mySlice := []int{1, 2, 3, 4, 5}
 
for i, v := range mySlice {
    fmt.Printf("%d -- %d -- %p\n", i, v, &v)
}

map 哈希表

  • 初始化一個 map 哈希表
  • 使用 for…range 遍歷 , map 對應(yīng)的 鍵值對
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)建一個可以緩沖 10 個 int 類型數(shù)據(jù)的通道
  • 創(chuàng)建一個協(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  的返回值有哪些情況,可以對于任何數(shù)據(jù)結(jié)構(gòu)使用嗎?

并不是所有數(shù)據(jù)結(jié)構(gòu)都可以使用  for…range  的,如下結(jié)構(gòu)可以使用這個方法

返回值 1 返回值 2 數(shù)據(jù)傳遞
字符串 索引 索引對應(yīng)的值 值傳遞
數(shù)組或者切片 索引 索引對應(yīng)的值 數(shù)組:值傳遞
切片:引用傳遞
哈希表 鍵對應(yīng)的值 指針
通道 通道中的數(shù)據(jù) 指針

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

相信寫過 golang 的 xdm 都知道,go 里面對于我們不需要的返回值,都可以使用 - 來表示 ,因此 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ū)別的
前面的文章,我們有說到,切片,對應(yīng)著 有 3 個元素的數(shù)據(jù)結(jié)構(gòu),一個是 cap,一個是 len, 一個是 ptr ,指向的是一個底層數(shù)組

切片是引用傳遞,但是傳遞數(shù)據(jù)的時候,切片這個變量是值傳遞,但是它實際指向的底層數(shù)組還是不會變的

咱們來寫一個 demo 查看一下:

我們思路是這個樣子:

遍歷一個 數(shù)組/切片,在遍歷當(dāng)前值的時候,去修改后面索引對應(yīng)的值,全部遍歷完畢后,查看結(jié)果中,實際的數(shù)據(jù)是否會被修改掉,若修改掉了,則是切片是傳引用,若沒有修改掉,則是數(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ān)于GO的range具體使用的文章就介紹到這了,更多相關(guān)GO range內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解

    go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解

    這篇文章主要為大家介紹了go使用consul實現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 使用Go構(gòu)建一款靜態(tài)分析工具Owl詳解

    使用Go構(gòu)建一款靜態(tài)分析工具Owl詳解

    Owl是一款開源項目依賴分析工具,可以快速在指定的項目目錄下查找符合某些特征的源代碼文件或者依賴文件,這篇文章主要介紹了使用Go構(gòu)建一款靜態(tài)分析工具,需要的朋友可以參考下
    2022-06-06
  • 簡單聊聊Go語言中空結(jié)構(gòu)體和空字符串的特殊之處

    簡單聊聊Go語言中空結(jié)構(gòu)體和空字符串的特殊之處

    在日常的編程過程中,大家應(yīng)該經(jīng)常能遇到各種”空“吧,比如空指針、空結(jié)構(gòu)體、空字符串等,本文就以?Go?語言為例,一起來看看空結(jié)構(gòu)體和空字符串在?Go?語言中的特殊之處吧
    2024-03-03
  • Go語言的結(jié)構(gòu)體還能這么用?看這篇就夠了

    Go語言的結(jié)構(gòu)體還能這么用?看這篇就夠了

    這篇文章主要為大家詳細(xì)介紹了Go語言結(jié)構(gòu)體的各個知識點,最后還介紹了空結(jié)構(gòu)體的3種妙用。文中的示例代碼講解詳細(xì),希望對大家有所幫助
    2023-02-02
  • Go語言中rune方法使用詳解

    Go語言中rune方法使用詳解

    本文主要介紹了Go語言中rune方法使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • GoLang協(xié)程庫libtask學(xué)習(xí)筆記

    GoLang協(xié)程庫libtask學(xué)習(xí)筆記

    libtask一個C語言的協(xié)程庫,是go語言的前身很早期的原型. 測試機器是我的mac air 安裝的centos虛擬機(只有一個核), 代碼沒有采用任何優(yōu)化,只是使用默認(rèn)配置
    2022-12-12
  • Go語言fmt庫詳解與應(yīng)用實例(格式化輸入輸出功能)

    Go語言fmt庫詳解與應(yīng)用實例(格式化輸入輸出功能)

    fmt庫是Go語言中一個強大而靈活的庫,提供了豐富的格式化輸入輸出功能,通過本文的介紹和實例演示,相信你對fmt庫的使用有了更深的理解,感興趣的朋友一起看看吧
    2023-10-10
  • golang?日志庫ZAP[uber-go?zap]示例詳解

    golang?日志庫ZAP[uber-go?zap]示例詳解

    ZAP是由Uber開源的高性能Go語言日志庫,支持多種日志級別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進(jìn)行日志切割,實現(xiàn)日志按文件大小、時間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器
    2024-10-10
  • 使用golang編寫一個并發(fā)工作隊列

    使用golang編寫一個并發(fā)工作隊列

    這篇文章主要介紹了使用golang編寫一個并發(fā)工作隊列的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 淺析GO并發(fā)處理選擇sync還是channel

    淺析GO并發(fā)處理選擇sync還是channel

    這篇文章主要想來和大家討論一下,GO?語言處理并發(fā)的時候我們是選擇sync還是channel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2023-08-08

最新評論

合阳县| 隆回县| 卫辉市| 青铜峡市| 临汾市| 浪卡子县| 永州市| 封开县| 吴堡县| 东乌珠穆沁旗| 雅江县| 康乐县| 靖江市| 灵山县| 赤城县| 海兴县| 正蓝旗| 乌兰察布市| 库尔勒市| 文安县| 墨竹工卡县| 特克斯县| 微山县| 高阳县| 尼木县| 上犹县| 广丰县| 宜兰市| 阳西县| 依兰县| 静宁县| 濮阳县| 陆丰市| 水城县| 斗六市| 高雄市| 曲周县| 漳平市| 虎林市| 河津市| 西城区|