技术文摘
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遍历 切片遍历结果差异 遍历原理分析
- 微信开放接口 getUserInfo、login、getUserProfile 的复杂关系
- 深度剖析官方博客:React18已至
- TensorFlow2 识别验证码的使用教程
- React17 升级后 Toast 组件无法使用,大佬求解
- Java17 新特性已定,Java 之父:25 年漏洞终告别
- 前端百题之从验证点至手撕 New 操作符
- Python 接收邮件的多样方式
- 深入学习 unary 方法,一篇指南
- 我常用的 10 个 C++新特性漫谈
- Python 中利用 socket 库实现 TCP/IP 客户和服务器通信
- Dooring 可视化搭建平台数据源设计深度解析
- 分布式事务之可靠消息最终一致性方案
- 设计模式中的模版方法模式
- Python 中 jieba 分词的手把手教学
- 低代码走红,号称能让开发者告别 996,是真神器还是伪风口