标签:申请 循环 声明 维数 迭代 结束 关键字 方式 var
使用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: 9
index: 1
通过计算行数和矩阵值,可以方便地写出如下的for
循环:
for row := range screen {
for column := range screen[row] {
screen[row][column] = 1
}
}
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)
}
}
range
可以用来枚举Unicode字符串,第一个参数为字符索引,第二个参数为字符(Unicode值)本身。
package main
import "fmt"
func main() {
for i, c := range "go" {
fmt.Println(i, c)
}
}
在循环过程中,并不是每次循环都会申请一个不同的临时变量;整个循环只声明一个临时变量,在循环结束后这个变量会被回收。
整个循环只定义一个临时变量,内存空间只有一份,每次遍历的值都会放在这个内存空间中。
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)
}
标签:申请 循环 声明 维数 迭代 结束 关键字 方式 var
原文地址:https://www.cnblogs.com/4thrun/p/Golang_8.html