2016-03-19 21 views
0

Karşılaştırmaya dayalı olarak iki dilimi nasıl çeviriyorsunuz ve birden çok dizini siliyorsunuz? Aşağıdakileri denedim, ancak bir hatayla sonuçlanır "panik: çalışma zamanı hatası: dilim sınırlarını dışında tutar."Git: iki dilimi karşılaştırın ve birden çok dizini silin

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

Not: yalnızca bir eşleşme bulunursa yukarıdaki çalışır. İki eşleşme bulunduğunda hata oluşur.

+0

Yan not, yukarıdakiler yalnızca bir eşleşme bulunduğunda çalışır. İki eşleşme bulunduğunda hata oluşur. –

+4

Olası yinelenen [Dilimlerdeki öğeleri kaldırın] (http://stackoverflow.com/questions/28699485/remove-elements-in-slice), ayrıca [Bir dilim içinde dilim öğesini kaldırın] (http://stackoverflow.com/ soruları/33495995/remove-slice-element-in-a-for için), ayrıca [golang içinde döngü içinde struct array öğesinin nasıl kaldırılacağı] (http://stackoverflow.com/questions/29005825/how-to-remove- elemanın-of-yapı-dizi-in-halka-in-golang). – icza

+0

Evet, haklı olduğunu düşünüyorum. "Dilimdeki öğeleri kaldır" aynı sorunu giderir. –

cevap

0

Pekala, bu bir şeydi, bir kez bir indeks dilimden kaldırıldığında geri kalan indeksler kayma pozisyonuna geçerek, döngü atmaya başladı. Sorun, döngü sayısı değişkeni azaltılarak çözüldü.

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 
     } 
    } 
} 
İlgili konular