使用range
关键字来遍历List
、array
或者map
。range
可以理解为“for each index of”。对于array
或者slices
,将会返回整型的下标;对于map
,将会返回键值对的键。range
支持返回单个值或者两个值。如果返回单个值,则为下标;否则为下标及其对应的值。
第一个返回值是数组或切片的索引,第二个是该索引位置的值(均为for
内部的局部变量)。
package main import "fmt"func main() { // 用range求slice的和 nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum) // 上面使用了空白符“_”丢弃索引 for i, num := range nums { if num == 3 { fmt.Println("index:", i) } }}
输出为:
sum: 9index: 1
for-range多维数组/切片通过计算行数和矩阵值,可以方便地写出如下的for
循环:
for row := range screen { for column := range screen[row] { screen[row][column] = 1 }}
for-range遍历集合map
不是按照键的顺序排序的,而是按照值来排序的。
package main import "fmt"func main() { kvs := map[string]string{"a": "apple", "b": "badapple"} for k, v := range kvs { fmt.Printf("%s -> %s\n", k, v) }}
for-range遍历字符串range
可以用来枚举Unicode字符串,第一个参数为字符索引,第二个参数为字符(Unicode值)本身。
package main import "fmt"func main() { for i, c := range "go" { fmt.Println(i, c) }}
for-range注意事项在循环过程中,并不是每次循环都会申请一个不同的临时变量;整个循环只声明一个临时变量,在循环结束后这个变量会被回收。
整个循环只定义一个临时变量,内存空间只有一份,每次遍历的值都会放在这个内存空间中。
var ss [5]struct{}// 第一种情况,简单地输出0、1、2、3、4for i := range ss { fmt.Println(i)}// 第二种情况,形成闭包// 捕获了变量i,但是是引用不是拷贝,for循环结束时i=4// 闭包输出结果都是4for i := range ss { defer func() { fmt.Println(i) }}// 第三种情况,形成闭包// 没有捕获变量i,通过传参方式得到拷贝// 结果是4、3、2、1、0for i := range ss { defer func(i int) { fmt.Println(i) }(i)}
总结 以上是内存溢出为你收集整理的Go入门(8)——循环迭代全部内容,希望文章能够帮你解决Go入门(8)——循环迭代所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)