微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Go入门8——循环迭代

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: 9
index: 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、4
for i := range ss {
    fmt.Println(i)
}

// 第二种情况,形成闭包
// 捕获了变量i,但是是引用不是拷贝,for循环结束时i=4
// 闭包输出结果都是4
for i := range ss {
    defer func() {
        fmt.Println(i)
    }
}

// 第三种情况,形成闭包
// 没有捕获变量i,通过传参方式得到拷贝
// 结果是4、3、2、1、0
for i := range ss {
    defer func(i int) {
        fmt.Println(i)
    }(i)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐