1. 循环语句range

    Golang range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。

    for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

    可忽略不想要的返回值,或 这个特殊变量。

    1. package main
    2. func main() {
    3. s := "abc"
    4. // 忽略 2nd value,支持 string/array/slice/map。
    5. for i := range s {
    6. println(s[i])
    7. }
    8. // 忽略 index。
    9. for _, c := range s {
    10. println(c)
    11. }
    12. // 忽略全部返回值,仅迭代。
    13. for range s {
    14. }
    15. m := map[string]int{"a": 1, "b": 2}
    16. println(k, v)
    17. }
    18. }

    输出结果:

    *注意,range 会复制对象。

    1. package main
    2. import "fmt"
    3. func main() {
    4. a := [3]int{0, 1, 2}
    5. for i, v := range a { // index、value 都是从复制品中取出。
    6. if i == 0 { // 在修改前,我们先修改原数组。
    7. a[1], a[2] = 999, 999
    8. fmt.Println(a) // 确认修改有效,输出 [0, 999, 999]。
    9. }
    10. }
    11. fmt.Println(a) // 输出 [100, 101, 102]。
    12. }

    建议改用引用类型,其底层数据不会被复制。

    1. package main
    2. func main() {
    3. s := []int{1, 2, 3, 4, 5}
    4. for i, v := range s { // 复制 struct slice { pointer, len, cap }。
    5. if i == 0 {
    6. s = s[:3] // 对 slice 的修改,不会影响 range。
    7. s[2] = 100 // 对底层数据的修改。
    8. }
    9. println(i, v)
    10. }

    输出结果:

    另外两种引用类型 map、channel 是指针包装,而不像 slice 是 struct。

    for 和 for range有什么区别?

    主要是使用场景不同

    遍历array和slice

    遍历key为整型递增的map

    遍历string

    for range可以完成所有for可以做的事情,却能做到for不能做的,包括

    遍历key为string类型的map并同时获取key和value