Go入门(8)——循环迭代

Go入门(8)——循环迭代,第1张

概述Go入门(8)——循环迭代使用range关键字来遍历list、array或者map。range可以理解为“foreachindexof”。对于array或者slices,将会返回整型的下标;对于map,将会返回键值对的键。range支持返回单个值或者两个值。如果返回单个值,则为下标;否则为下标及其对应的值。for-range遍历数组/ Go入门(8)——循环迭代

使用range关键字来遍历Listarray或者maprange可以理解为“for each index of”。对于array或者slices,将会返回整型的下标;对于map,将会返回键值对的键。range支持返回单个值或者两个值。如果返回单个值,则为下标;否则为下标及其对应的值。

for-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)——循环迭代所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1241514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存