GO 言语的独霸 for…range 能做甚么呢 ?
for…range 若何独霸 ?
for…range 的前去值有哪些气候
,可以对任何数据筹划独霸吗?具体
for…range 的前去值假定不须要,可以若何措置
?独霸
for…range 的数据是若何传递的 ?
刚进修 golang 的 xdm 会不会有上面的疑问 ?真实很复杂,我们就一个一个的具体来分享和实操一遍
golang 的 for…range 是 go 本身的语法 ,可以用来遍历数据筹划 ,独霸有以下数据筹划可以遍历
我们分袂来看看可以若何独霸他们,for…range 相当于一个迭代器,独霸可以遍历数据筹划的具体键/索引 和值
初始化一个数组
独霸 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) }}初始化一个切片
独霸 for…range 遍历
, 对应的具体是 索引 和 值
mySlice := []int{ 1, 2, 3, 4, 5} for i, v := range mySlice { fmt.Printf("%d -- %d -- %p\n", i, v, &v)}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)}package mainimport "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 的,以下筹划可独霸这浅近例
| 前去值 1 | 前去值 2 | 数据传递 | |
|---|---|---|---|
| 字符串 | 索引 | 索引对应的具体值 | 值传递 |
| 数组或切片 | 索引 | 索引对应的值 | 数组
:值传递 切片 :援引传递 |
| 哈希表 | 键 | 键对应的值 | 指针 |
| 通道 | 通道中的数据 | 指针 |
信赖写过 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
经由过程上述的案例,相决意决意决意决计里都有点谱了吧
到此这篇关于Go言语的range具体独霸的文章就引见到这了,更多相干GO range内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!