若何优化Win10游戏流畅运转?Win10游戏流畅运转优化教程

时尚 5℃

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内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !