for range语法结构
for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel)。
for range 语法上类似于其它语言中的 foreach 语句,一般形式为:
for key, val := range coll {...}
需要要注意的是,val 始终为集合中对应索引的值拷贝,因此它一般只具有只读性质,对它所做的任何修改都不会影响到集合中原有的值。
一个字符串是 Unicode 编码的字符(或称之为 rune )集合。
因此也可以用它来迭代字符串:
for pos, char := range str {...}
每个 rune 字符和索引在 for range 循环中是一一对应的,它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。
通过 for range 遍历的返回值有一定的规律:
数组、切片、字符串返回索引和值。
map 返回键和值。
通道(channel)只返回通道内的值。
遍历数组、切片 -> 获得索引和值
下面的代码展示如何遍历切片,数组也是类似的遍历方法:
package mainimport "fmt"func main() {for key , value := range [] string{"杨幂", "古力娜扎", "刘小昭", "迪丽热巴", "赵奕欢"} {fmt.Printf("key:%d value:%s\n",key,value)}}
输出内容如下:
key:0 value:杨幂key:1 value:古力娜扎key:2 value:刘小昭key:3 value:迪丽热巴key:4 value:赵奕欢
遍历字符串 —> 获得字符
Go语言和其他语言类似,可以通过 for range 的组合,对字符串进行遍历,遍历时,key 和 value 分别代表字符串的索引和字符串中的每一个字符。
package mainimport "fmt"//字符串传统遍历方式func main() {var str string = "jiao ji is my love"for i :=0; i < len(str); i++ {fmt.Printf("%c \n",str[i])}//字符串遍历方式 for rangestr = "abc--ok"for key, value := range str {fmt.Printf("index=%d, val=%c \n", key,value)}}
输出内容如下:
jiaojiismyloveindex=0, val=aindex=1, val=bindex=2, val=cindex=3, val=-index=4, val=-index=5, val=oindex=6, val=k
遍历 map —> 获得 map 的键和值
对于 map 类型来说,for range 遍历时,key 和 value 分别代表 map 的索引键 key 和索引对应的值,一般被称为 map 的键值对,因为它们是一对一对出现的,下面的代码演示了如何遍历 map。
输出内容如下:
注意
对 map 遍历时,遍历输出的键值是无序的,如果需要有序的键值对输出,需要对结果进行排序。
