1. 迭代对象是切片,迭代过程中修改切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {<!-- -->
    // 示例1。
    numbers1 := []int{<!-- -->1, 2, 3, 4, 5, 6}
    // 只有一个迭代变量时,i 表示为迭代对应元素的索引值
    for i := range numbers1 {<!-- -->
        if i == 3 {<!-- -->
            numbers1[i] |= i
        }
    }
    fmt.Println(numbers1) // [1 2 3 7 5 6]
    fmt.Println()
}

注意:numbers3 为切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"

func main() {<!-- -->
    numbers3 := []int{<!-- -->1, 2, 3, 4, 5, 6}
    maxIndex3 := len(numbers3) - 1
    for i, e := range numbers3 {<!-- -->
        if i == maxIndex3 {<!-- -->
            numbers3[0] += e
        } else {<!-- -->
            numbers3[i+1] += e
        }
    }
    fmt.Println(numbers3) // [22 3 6 10 15 21]
}

2. 迭代对象是数组,迭代过程中修改数组

注意:numbers2 为数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {<!-- -->

    numbers2 := [...]int{<!-- -->1, 2, 3, 4, 5, 6}
    maxIndex2 := len(numbers2) - 1
    for i, e := range numbers2 {<!-- -->
        if i == maxIndex2 {<!-- -->
            numbers2[0] += e
        } else {<!-- -->
            numbers2[i+1] += e
        }
    }
    fmt.Println(numbers2) // [7 3 5 7 9 11]
    fmt.Println()
}

注意两点:

  • range 表达式只会在 for 语句开始执行时被求值一次,无论后边会有多少次迭代;
  • range 表达式的求值结果会被复制,也就是说,被迭代的对象是rrange 表达式结果值的副本而不是原值;