分析遍历数组和切片清空元素的情况;
分析使用 for range a {} 遍历数组和切片,不关心索引和数据的情况;
分析使用 for i := range a {} 遍历数组和切片,只关心索引的情况;
分析使用 for i, elem := range a {} 遍历数组和切片,关心索引和数据的情况;
复制了一份,所以在循环中append没问题
引入range中的v,v的地址是固定的,只是值更新了
一个优化:
cmd/compile/internal/gc.arrayClear 是一个非常有趣的优化,它会优化 Go 语言遍历数组或者切片并删除全部元素的逻辑:
1
2
3
4
5
6
7
8
9
10
11
12
|
// 原代码
for i := range a {
a[i] = zero // 这是置为零值?
}
// 优化后
if len(a) != 0 {
hp = &a[0]
hn = len(a)*sizeof(elem(a))
memclrNoHeapPointers(hp, hn)
i = len(a) - 1
}
|
遍历数组和切片时,发生拷贝后,再做循环。
go是怎么遍历map的?遍历时在map中新增元素会怎样?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package main
import "fmt"
func main() {
mp := map[int]int{
1: 1,
2: 2,
3: 3,
}
for k, v := range mp {
fmt.Println(k, v, len(mp))
mp[k+1] = v
}
fmt.Println("---------")
for k, v := range mp {
fmt.Println(k, v)
}
}
|
字符串遍历是遍历rune