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