日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

GO的range如何使用詳解_Golang

作者:阿兵云原生 ? 更新時間: 2023-04-22 編程語言

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

for…range 如何使用 ?

for…range 的返回值有哪些情況,可以對于任何數據結構使用嗎?

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

for…range 的數據是如何傳遞的?

剛學習 golang 的 xdm 會不會有上面的疑問?其實很簡單,我們就一個一個的來分享和實操一遍

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

golang 的 for…range 是 go 自身的語法,可以用來遍歷數據結構,有如下數據結構可以遍歷

  • 切片 slice
  • 數組 array
  • map 哈希表
  • channel 通道

for…range 如何使用 ?

我們分別來看看可以如何使用他們,for…range 相當于一個迭代器,可以遍歷數據結構的鍵/索引 和值

數組 array

  • 初始化一個數組
  • 使用 for…range 遍歷 , 對應的是 索引 和 值
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 遍歷 , 對應的是 索引 和 值
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 對應的 鍵值對
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 通道

  • 創建一個可以緩沖 10 個 int 類型數據的通道
  • 創建一個協程專門向通道中寫入數據
  • 主協程遍歷通道,讀取數據
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 的返回值有哪些情況,可以對于任何數據結構使用嗎?

并不是所有數據結構都可以使用 for…range 的,如下結構可以使用這個方法

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

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

相信寫過 golang 的 xdm 都知道,go 里面對于我們不需要的返回值,都可以使用 - 來表示 ,因此 for…range 當然也可以這樣

例如:

myMap := map[string]string{
    "name":  "xmt",
    "hobby": "program",
    "addr":  "mengli",
}
for _, v := range myMap {
    fmt.Printf("%s -- %p\n", v, &v)
}

for…range 的數據是如何傳遞的?

數據都是通過復制傳遞的,也就是都是值傳遞的,只不過由于數據結構不一樣,數組和切片在這里還是有一些區別的

前面的文章,我們有說到,切片,對應著 有 3 個元素的數據結構,一個是 cap,一個是 len, 一個是 ptr ,指向的是一個底層數組

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

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

我們思路是這個樣子:

遍歷一個 數組/切片,在遍歷當前值的時候,去修改后面索引對應的值,全部遍歷完畢后,查看結果中,實際的數據是否會被修改掉,若修改掉了,則是切片是傳引用,若沒有修改掉,則是數組是傳值

數組的效果

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

通過上述的案例,相信心里都有點譜了吧

原文鏈接:https://blog.csdn.net/m0_37322399/article/details/128944022

欄目分類
最近更新