分析遍历数组和切片清空元素的情况;
分析使用 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