golang中使用for range语句修改切片问题

本文探讨了在Golang中从切片中删除指定元素的方法,并对比了不同循环方式的效果。通过实例说明了直接在for-range循环中修改切片长度可能导致的越界错误,以及如何通过逆序遍历避免该问题。

以下golang代码会报错:

package main

import "fmt"

func main() {
	sli :=[]int{1,2,3,4,4}
	for idx, val:=range sli{
		if val == 4{
			sli =append(sli[0:idx],sli[idx+1:]...)
		}
	}
	fmt.Printf("%v\n",sli)
}
panic: runtime error: slice bounds out of range [5:4]

goroutine 1 [running]:
main.main()
	/box/main.go:9 +0x273

Exited with error status 2

可以认为,在执行for语句时,idx的迭代值已经确定并缓存起来了,不会因为为sli的变化而变化,所以len(sli)变小后,会发生越界panic

使用for index,index递增

package main

import "fmt"

func main() {
	sli :=[]int{4,2,3,4,4}
	for idx:=0;idx< len(sli);idx++{
		if sli[idx] == 4{
			sli =append(sli[0:idx],sli[idx+1:]...)
		}
	}
	fmt.Printf("%v\n",sli)
}
输出:[2 3 4]
因为idx的递增和填补效果,遗漏部分元素,不行

正确的处理方式:index递减

package main

import "fmt"

func main() {
	sli :=[]int{4,2,3,4,4}
	for idx:=len(sli)-1;idx >=0;idx--{
		if sli[idx] == 4{
			sli =append(sli[0:idx],sli[idx+1:]...)
		}
	}
	fmt.Printf("%v\n",sli)
}

原因在于从后面删除元素,不会发生未遍历元素移位现象

### Golang 中 `for` 循环的用法 在 Go 编程语言中,`for` 是唯一的循环结构。它具有多种形式来满足不同的需求。 #### 基本语法 最简单的 `for` 循环由初始化语句、条件表达式和后续语句组成[^1]: ```go sum := 0 for i := 0; i < 10; i++ { sum += i } ``` 上述代码展示了如何通过传统的三部分定义来进行迭代操作。这里变量 `i` 初始化为零,并且每次执行完循环体之后都会增加一单位直到达到终止条件为止。 #### 使用 range 关键字遍历切片或映射 当需要访问集合中的每一个元素时,可以利用 `range` 来简化过程[^2]: 对于数组或者 slice: ```go numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { fmt.Printf("Index=%d Value=%d\n", index,value ) } ``` 如果只关心而不需要索引的话,则可以选择忽略第一个返回参数 `_`, 如下所示: ```go names := []string{"Alice","Bob"} for _, name := range names{ println(name) } ``` 同样地,这种方法也适用于 map 数据类型的处理[^3]: ```go ages := make(map[string]int) ages["John"] = 27 ages["Paul"] = 28 for key, val := range ages { fmt.Println(key,"is",val,"years old.") } ``` #### 无限循环 有时候可能希望创建一个持续运行的任务直至特定事件发生停止之情况下来实现永不停止的功能[^4], 可以省略掉所有的控制成分从而形成死循环模式: ```go package main import "time" func main(){ ticker := time.NewTicker(1 * time.Second) for _= range ticker.C { // Do something every second. } } ``` 以上实例演示了一个定时器功能,其中每隔一秒就会触发一次动作。 #### 总结 Go 提供了灵活多样的 `for` 结构适应不同场景下的应用开发需求。无论是基础数计算还是复杂的数据集管理都能找到合适的解决方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值