golang中,常用的遍历方式有经典的for循环和for range两种。实际上,使用 for range 语法的控制结构最终应该也会被golang的编译器转换成普通的 for 循环,所以for range实际上会被先转换成经典的for循环再真正执行,而正是这个转换过程常常会留坑。
下面简单表示这个转换过程:
for range代码是:
for index, value := range t_slice {
original body
}
转换后:
len_temp := len(t_slice)
range_temp := t_slice
for index_temp = 0; index_temp < len_temp; index_temp++ {
value_temp := range_temp[index_temp]
index := index_temp
value := value_temp
original body
}
实际编码中可能遇到的问题
循环会不会停?
代码如下:
package main
import "fmt"
func main() {
arr := []int{
1,2}
for _, v := range arr {
arr = append(arr, v)
}
fmt.Println(arr)
}
结果:
[1 2 1 2]
从上面的转换过程可以看到,循环在还没开始时已经拿到了循环的长度,在循环的过程中不会改变。
遍历取所有元素地址?
代码如下:
package main
import "fmt"
func main() {
arr := []int{
1,2}
res