for range语法结构

for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel)。

for range 语法上类似于其它语言中的 foreach 语句,一般形式为:

  1. for key, val := range coll {
  2. ...
  3. }

需要要注意的是,val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。

一个字符串是 Unicode 编码的字符(或称之为 rune )集合。
因此也可以用它来迭代字符串:

  1. for pos, char := range str {
  2. ...
  3. }

每个 rune 字符和索引在 for range 循环中是一一对应的,它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。

通过 for range 遍历的返回值有一定的规律:
数组、切片、字符串返回索引和值。
map 返回键和值。
通道(channel)只返回通道内的值。

遍历数组、切片 -> 获得索引和值

下面的代码展示如何遍历切片,数组也是类似的遍历方法:

  1. package main
  2. import "fmt"
  3. func main() {
  4. for key , value := range [] string{"杨幂", "古力娜扎", "刘小昭", "迪丽热巴", "赵奕欢"} {
  5. fmt.Printf("key:%d value:%s\n",key,value)
  6. }
  7. }

输出内容如下:

  1. key:0 value:杨幂
  2. key:1 value:古力娜扎
  3. key:2 value:刘小昭
  4. key:3 value:迪丽热巴
  5. key:4 value:赵奕欢

遍历字符串 —> 获得字符

Go语言和其他语言类似,可以通过 for range 的组合,对字符串进行遍历,遍历时,key 和 value 分别代表字符串的索引和字符串中的每一个字符。

  1. package main
  2. import "fmt"
  3. //字符串传统遍历方式
  4. func main() {
  5. var str string = "jiao ji is my love"
  6. for i :=0; i < len(str); i++ {
  7. fmt.Printf("%c \n",str[i])
  8. }
  9. //字符串遍历方式 for range
  10. str = "abc--ok"
  11. for key, value := range str {
  12. fmt.Printf("index=%d, val=%c \n", key,value)
  13. }
  14. }

输出内容如下:

  1. j
  2. i
  3. a
  4. o
  5. j
  6. i
  7. i
  8. s
  9. m
  10. y
  11. l
  12. o
  13. v
  14. e
  15. index=0, val=a
  16. index=1, val=b
  17. index=2, val=c
  18. index=3, val=-
  19. index=4, val=-
  20. index=5, val=o
  21. index=6, val=k

遍历 map —> 获得 map 的键和值

对于 map 类型来说,for range 遍历时,key 和 value 分别代表 map 的索引键 key 和索引对应的值,一般被称为 map 的键值对,因为它们是一对一对出现的,下面的代码演示了如何遍历 map。
输出内容如下:

注意

对 map 遍历时,遍历输出的键值是无序的,如果需要有序的键值对输出,需要对结果进行排序。

遍历通道(channel)—> 接收通道数据