go - 遍历切片并通过“append()”修改它时出现“切片超出范围”错误
问题描述
我编写了一个函数,用一段字符串([]string)中的一个单词替换重复单词的序列。我使用“range”循环切片并使用“append()”修改切片。下面是代码:
func RemoveContinuosStrings(input []string) []string {
top:=0
for i,_ := range input {
if input[i] != input[top] {
if top != i-1 {
input = append(input[:top+1], input[i:]...)
}
top = i
}
}
return input[:top+1]
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("enter text")
input := make([]string, 0, 0)
for scanner.Scan() {
input = append(input, scanner.Text())
}
fmt.Println("INPUT", input)
input = RemoveContinuosStrings(input)
fmt.Println("OUTPUT", input)
}
在执行上述代码时,我看到以下错误:
===================================================
vignesh@vignesh-ThinkPad-E470 ~/go-book/chapter4 $ ./4_6_eliminate_duplicate_string
enter text
qwe
asd
asd
zxc
asd
asd
INPUT [qwe asd asd zxc asd asd]
panic: runtime error: index out of range
goroutine 1 [running]:
main.RemoveContinuosStrings(0xc420088000, 0x6, 0x8, 0x20, 0x0, 0x0)
/home/vignesh/go-book/chapter4/4_6_eliminate_duplicate_string.go:11 +0x2a0
main.main()
/home/vignesh/go-book/chapter4/4_6_eliminate_duplicate_string.go:33 +0x33a
vignesh@vignesh-ThinkPad-E470 ~/go-book/chapter4 $
=======================================================
因此,是否错误或不允许附加到通过“范围”迭代的切片。我在网上看到了几个例子,它们确实附加到了切片上,但是在不使用“范围”的情况下进行了迭代(例如:for i=0; i< lenOfSlice; i++)。如果我错了,请帮助/纠正我:)
解决方案
当您在循环中更改数组大小时,请记住使用简单的 for 而不是 for range
func RemoveContinuosStrings(input []string) []string {
top:=0
for i:=0;i<len(input);i++ {
if input[i] != input[top] {
if top != i-1 {
input = append(input[:top+1], input[i:]...)
i=top+1
top=top+1
}else{
top = i
}
}
}
return input[:top+1]
}
推荐阅读
- java - 为什么消费者会降低生产者的绩效
- firebase-cloud-messaging - 从2019/03/27开始,为什么有些ios设备收不到fcm消息?
- python - 缺少 Python 类属性
- java - Open Liberty 19.0.0.3 中的消息驱动 Bean 在访问 ActiveMQ 时未激活
- c++ - While 循环在一个函数调用中执行两次
- swift - 如何仅在 SceneKit 球体的一部分上应用菲涅尔效果?
- neo4j - 找到具有关系条件的最短路径
- asp.net-mvc - url 中存在尾随句点时出现 404 错误
- angular - 当默认加载器已经变得更安全时,为什么 PyYAML 5.1 会引发 YAMLLoadWarning?
- ios - 在按钮中的文本两侧添加填充