这篇文章是关于如何在GO中使用范围。我觉得边肖挺实用的,就分享给大家参考,和边肖一起来看看。
GO 语言的 for…range 能做什么呢?
golang的for…range是go本身的语法,可以用来遍历数据结构。可以遍历以下数据结构。
切片切片
排列
映射哈希表
频道频道
for…range 如何使用 ?
让我们看看如何分别使用它们。for…range相当于一个迭代器,可以遍历数据结构的键/索引和值。
00-1010初始化数组。
使用for…范围遍历,对应于索引和值。
func main(){ 0
myArray:=[5]int{1,2,3,4,5}
fori,v:=rangemyArray {
fmt。Printf('%d - %d - %p\n ',I,v,v)
}
}
数组 array
初始化切片。
使用for…范围遍历,对应于索引和值。
mySlice:=[]int{1,2,3,4,5}
fori,v:=rangemySlice{
fmt。Printf('%d - %d - %p\n ',I,v,v)
}映射哈希表
初始化映射哈希表。
使用for…range遍历对应于映射的键值对。
myMap:=映射[字符串]字符串{
名称' :'xmt ',
爱好' : '程序',
地址' : '李梦',
}
fork,v:=rangemyMap{
fmt。Printf('%s - %s - %p\n ',k,v,v)
}
切片 slice
创建一个可以缓冲10帧数据的通道。
创建一个协调程序,将数据写入通道。
主进程遍历通道并读取数据。
packagemain
导入“fmt”
varmyCh=make(chanint,10)
FuncWritech(){ 0
for i:=0;i5;我
myCh-i
}
关闭(myCh)
}
func main(){ 0
gowriteCh()
对于{ 0
fordata:=rangemyCh{
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
感谢各位的阅读!关于“GO中range怎么用”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/60757.html