Go:比较两个切片并删除多个索引
Go: compare two slices and delete multiple indices
如何根据比较遍历两个切片并删除多个索引?我尝试了以下操作,但会导致错误 "panic: runtime error: slice bounds out of range."
package main
import (
"fmt"
)
func main() {
type My struct {
SomeVal string
}
type Other struct {
OtherVal string
}
var MySlice []My
var OtherSlice []Other
MySlice = append(MySlice, My{SomeVal: "abc"})
MySlice = append(MySlice, My{SomeVal: "mno"})
MySlice = append(MySlice, My{SomeVal: "xyz"})
OtherSlice = append(OtherSlice, Other{OtherVal: "abc"})
OtherSlice = append(OtherSlice, Other{OtherVal: "def"})
OtherSlice = append(OtherSlice, Other{OtherVal: "xyz"})
for i, a := range MySlice {
for _, oa := range OtherSlice {
if a.SomeVal == oa.OtherVal {
MySlice = MySlice[:i+copy(MySlice[i:], MySlice[i+1:])]
}
}
}
fmt.Println(MySlice)
}
http://play.golang.org/p/4pgxE3LNmx
注意:如果只找到一个匹配项,则以上方法有效。当找到两个匹配项时会发生错误。
好吧,事情就是这样,一旦从切片中删除了一个索引,其余索引就会移动位置,从而使循环计数停止。通过递减循环计数变量解决了该问题。
for i := 0; i < len(MySlice); i++ {
for _, oa := range OtherSlice {
if MySlice[i].SomeVal == oa.OtherVal {
MySlice = append(MySlice[:i], MySlice[i+1:]...)
i--
break
}
}
}
如何根据比较遍历两个切片并删除多个索引?我尝试了以下操作,但会导致错误 "panic: runtime error: slice bounds out of range."
package main
import (
"fmt"
)
func main() {
type My struct {
SomeVal string
}
type Other struct {
OtherVal string
}
var MySlice []My
var OtherSlice []Other
MySlice = append(MySlice, My{SomeVal: "abc"})
MySlice = append(MySlice, My{SomeVal: "mno"})
MySlice = append(MySlice, My{SomeVal: "xyz"})
OtherSlice = append(OtherSlice, Other{OtherVal: "abc"})
OtherSlice = append(OtherSlice, Other{OtherVal: "def"})
OtherSlice = append(OtherSlice, Other{OtherVal: "xyz"})
for i, a := range MySlice {
for _, oa := range OtherSlice {
if a.SomeVal == oa.OtherVal {
MySlice = MySlice[:i+copy(MySlice[i:], MySlice[i+1:])]
}
}
}
fmt.Println(MySlice)
}
http://play.golang.org/p/4pgxE3LNmx
注意:如果只找到一个匹配项,则以上方法有效。当找到两个匹配项时会发生错误。
好吧,事情就是这样,一旦从切片中删除了一个索引,其余索引就会移动位置,从而使循环计数停止。通过递减循环计数变量解决了该问题。
for i := 0; i < len(MySlice); i++ {
for _, oa := range OtherSlice {
if MySlice[i].SomeVal == oa.OtherVal {
MySlice = append(MySlice[:i], MySlice[i+1:]...)
i--
break
}
}
}