为了账号安全,请及时绑定邮箱和手机立即绑定

Go:比较两个切片并删除多个索引

Go:比较两个切片并删除多个索引

Go
猛跑小猪 2021-12-27 14:58:31
如何根据比较遍历两个切片并删除多个索引?我尝试了以下操作,但会导致错误“恐慌:运行时错误:切片边界超出范围”。package mainimport (    "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注意:如果仅找到一个匹配项,则上述方法有效。当找到两个匹配项时会发生错误。
查看完整描述

1 回答

?
达令说

TA贡献1821条经验 获得超6个赞

好的,就是这样,一旦从切片中删除索引,剩余的索引就会移动位置,从而使循环计数关闭。该问题已通过递减循环计数变量解决。


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

        }

    }

}


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信