若何优化Win10游戏流畅运转?Win10游戏流畅运转优化教程
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 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 的前去值有哪些气候,可以对任何数据筹划独霸吗?独霸
真实不是所罕有据筹划都可独霸 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具体独霸的文章就引见到这了,更多相干GO range内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !






















