码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-04-07 11:38:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:申请   循环   声明   维数   迭代   结束   关键字   方式   var   

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)
}

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

标签:申请   循环   声明   维数   迭代   结束   关键字   方式   var   

原文地址:https://www.cnblogs.com/4thrun/p/Golang_8.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!