技术文摘
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遍历 切片遍历结果差异 遍历原理分析
- 三星重磅亮相 Cocos 开发者大会 分享 Gear VR 核心技术
- WOT2016翁宁龙分享美团数据库自动化运维系统
- WOT2016杨大海分享优酷土豆Hadoop集群应对海量数据与高并发方法
- 手机微博运维监控系统实战经验分享
- 好的BUG报告炼成之道_移动·开发技术周刊
- 创意无穷 你最特别 - 9秒魔镜VR游戏开发大赛隆重开启
- 4个绞尽脑汁却坠入编程地狱的陷阱
- 180人小公司如何做到年收150亿
- JavaScript中DOM操作慢的原因
- 雪球首席架构师唐福林的服务化实践之路
- 学生变身游戏开发者,我学到的五件事
- 人工智能怎样掀起下一波创业热潮
- 微软称 C#与 Visual Basic 即将分离
- 未来为何是全栈工程师的世界
- 阿里七年老员工分享新人程序员成长经验