package main import"fmt" funcmain(){ //数组的遍历 a := [3]int {1, 2, 3} for i, n := range a{ fmt.Println(i, n) } //切片的遍历 b := []int{2, 3, 4} for i, n := range b{ fmt.Println(i, n) } //map的遍历 c := map[string]int{"Hello":1, "World":2} for k, v := range c{ fmt.Println(k, v) } }
结果:
1 2 3 4 5 6 7 8
0 1 1 2 2 3 0 2 1 3 2 4 Hello 1 World 2
二、注意事项
1. range会复制对象,而不是不是直接在原对象上操作。
示例一:
1 2 3 4 5 6 7 8 9
package main import"fmt" funcmain(){ a := [3]int {1, 2, 3} for _, v := range a{ //复制一份a遍历[1, 2, 3] v += 100//v是复制对象中的值,不会改变a数组元素的值 } fmt.Println(a) //1 2 3 }
示例二:
1 2 3 4 5 6 7 8 9 10 11 12 13
package main import"fmt" funcmain(){ a := [3]int {1, 2, 3} for i, v := range a{ //i,v从a复制的对象里提取出 if i == 0{ a[1], a[2] = 200, 300 fmt.Println(a) //输出[1 200 300] } a[i] = v + 100//v是复制对象里的元素[1, 2, 3] } fmt.Println(a) //输出[101, 102, 103] }
2. 使用range迭代遍历引用类型时,底层的数据不会被复制:
1 2 3 4 5 6 7 8 9 10 11 12 13
package main import"fmt" funcmain(){ a := []int {1, 2, 3} //改成slice for i, v := range a{ if i == 0{ a[1], a[2] = 200, 300 fmt.Println(a) //[1 200 300] } a[i] = v + 100 } fmt.Println(a) }
在对slice进行range的时候,其实每一次都是进行了深拷贝的, 若不进行深拷贝,切片b的输出结果应该为{200,300,103}
```
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
b := []int{1, 2, 3}
for k, v := range a {//v只获取到了a数组中的值
if k == 0 {
a[0], a[1] = 100, 200
fmt.Printf("k:%v a:%v\n", k, a)
}
a[k] = 100 + v
}
for k, v := range b {//每一次循环v是对b[k]的深拷贝 ,这样才可以解释{101,200,103}的输出结果
if k == 0 {
b[0], b[1] = 100, 200
fmt.Printf("k:%v b:%v\n", k, b)
}
b[k] = 100 + v
}
fmt.Printf("a: %v\n b: %v\n", a, b)
}
```
输出结果为:
```
k:0 a:[100 200 3]
k:0 b:[100 200 3]
a: [101 102 103]
b: [101 300 103]
```
package main import"fmt" funcmain(){ //数组的遍历 a := [3]int {1, 2, 3} for i, n := range a{ fmt.Println(i, n) } //切片的遍历 b := []int{2, 3, 4} for i, n := range b{ fmt.Println(i, n) } //map的遍历 c := map[string]int{"Hello":1, "World":2} for k, v := range c{ fmt.Println(k, v) } }
结果:
1 2 3 4 5 6 7 8
0 1 1 2 2 3 0 2 1 3 2 4 Hello 1 World 2
二、注意事项
1. range会复制对象,而不是不是直接在原对象上操作。
示例一:
1 2 3 4 5 6 7 8 9
package main import"fmt" funcmain(){ a := [3]int {1, 2, 3} for _, v := range a{ //复制一份a遍历[1, 2, 3] v += 100//v是复制对象中的值,不会改变a数组元素的值 } fmt.Println(a) //1 2 3 }
示例二:
1 2 3 4 5 6 7 8 9 10 11 12 13
package main import"fmt" funcmain(){ a := [3]int {1, 2, 3} for i, v := range a{ //i,v从a复制的对象里提取出 if i == 0{ a[1], a[2] = 200, 300 fmt.Println(a) //输出[1 200 300] } a[i] = v + 100//v是复制对象里的元素[1, 2, 3] } fmt.Println(a) //输出[101, 102, 103] }
2. 使用range迭代遍历引用类型时,底层的数据不会被复制:
1 2 3 4 5 6 7 8 9 10 11 12 13
package main import"fmt" funcmain(){ a := []int {1, 2, 3} //改成slice for i, v := range a{ if i == 0{ a[1], a[2] = 200, 300 fmt.Println(a) //[1 200 300] } a[i] = v + 100 } fmt.Println(a) }