for range 和 for i 遍历切片输出结果不同的原因

2025-01-09 02:46:09   小编

for range 和 for i 遍历切片输出结果不同的原因

在 Go 语言编程中,for rangefor i 这两种遍历切片的方式十分常见,但有时开发者会惊讶地发现,使用它们遍历切片时输出结果竟然不同。下面我们就来深入探讨一下其中的原因。

来看 for i 遍历切片。在这种方式下,我们通过索引来访问切片中的元素。例如:

package main

import (
    "fmt"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    for i := 0; i < len(numbers); i++ {
        numbers[i] += 1
        fmt.Println(numbers[i])
    }
}

在这个代码中,i 从 0 开始,依次递增到 len(numbers) - 1,通过 numbers[i] 直接操作切片中的元素,输出结果就是每个元素加 1 后的数值。

for range 遍历切片时,情况则有所不同。for range 会创建每个元素的副本。例如:

package main

import (
    "fmt"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    for _, num := range numbers {
        num += 1
        fmt.Println(num)
    }
    fmt.Println(numbers)
}

在这个例子里,range 遍历切片 numbers 时,为每个元素创建了一个副本 num,我们对 num 进行加 1 操作,并不会影响到原切片 numbers 中的元素。所以,最后输出原切片 numbers 时,其值并没有改变。

如果想要在 for range 中修改切片元素,可以通过索引来操作。比如:

package main

import (
    "fmt"
)

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    for i := range numbers {
        numbers[i] += 1
    }
    fmt.Println(numbers)
}

通过 range 获取索引 i,再利用 numbers[i] 就可以修改原切片中的元素。

for rangefor i 遍历切片输出结果不同的核心原因在于,for range 在遍历过程中创建了元素副本,直接操作副本不会影响原切片;而 for i 是通过索引直接访问和操作原切片元素。理解这一差异,能帮助开发者在编写代码时更准确地实现预期功能,避免因遍历方式不当而导致的逻辑错误。

TAGS: for i遍历 for range遍历 切片遍历结果差异 遍历原理分析

欢迎使用万千站长工具!

Welcome to www.zzTool.com