技术文摘
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遍历 切片遍历结果差异 遍历原理分析
- Vue与Vue视图3的区别
- JavaScript开发者的高效调试策略 ⚡️
- Cyclops与Kubernetes助力Hideout扩展
- PS人像修图新手教程
- PS修图教程:快捷键全面详解
- 有哪些提供ps修图教程资源的网站
- 随心思绪#2
- inute里的JavaScript
- GraphQL中利用Siftjs实现任意列表过滤的方法
- 留意含Framer Motion、TailwindCSS和NextJs的页面中损坏的链接
- JavaScript开发环境设置入门
- 2024年PS修图教程文字版
- PS修图新手入门教程及基础知识
- ps修图教程:人物眼影的制作方法
- 借助 CSS 网格与 Flexbox 实现响应式网页设计