簡體   English   中英

開始:比較兩個切片並刪除多個索引

[英]Go: compare two slices and delete multiple indices

如何根據比較結果循環兩個切片並刪除多個索引? 我嘗試了以下操作,但會導致錯誤“出現緊急情況:運行時錯誤:切片范圍超出范圍”。

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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM