2016-03-19 7 views
0

Wie schleift man zwei Scheiben und löscht mehrere Indizes, basierend auf dem Vergleich? Ich habe Folgendes versucht, aber es ergibt sich ein Fehler "Panik: Laufzeitfehler: Slice Grenzen außerhalb des Bereichs."Go: zwei Scheiben vergleichen und mehrere Indizes löschen

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

Hinweis: Die oben genannten Arbeiten, wenn nur eine Übereinstimmung gefunden wird. Der Fehler tritt auf, wenn zwei Übereinstimmungen gefunden werden.

+0

Seitliche Anmerkung, das oben genannte funktioniert, wenn nur eine Übereinstimmung gefunden wird. Der Fehler tritt auf, wenn zwei Übereinstimmungen gefunden werden. –

+4

Mögliches Duplikat von [Elemente in Slice entfernen] (http://stackoverflow.com/questions/28699485/remove-elements-in-slice), auch [Slice-Element in einem entfernen für] (http://stackoverflow.com/) Fragen/33495995/remove-slice-Element-in-einem-für), auch [Wie Element des Struct-Arrays in Schleife in Golang entfernen] (http://stackoverflow.com/questions/29005825/how-to-remove- Element-of-Struktur-Array-in-Schleife-in-Golang). – icza

+0

Ja, ich denke du hast Recht. "Remove elements in slice" behebt dasselbe Problem. –

Antwort

0

Okay, also das war die Sache, sobald ein Index aus dem Slice entfernt wird die restlichen Indizes Schichtposition, werfen die Schleife abzählen. Das Problem wurde gelöst, indem die Loop-Count-Variable dekrementiert wurde.

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