Elemente iterativ aus einem Slice entfernen
Beim Durchlaufen eines Slice kann das Entfernen eines Elements innerhalb der Schleife aufgrund der Verschiebung schwierig sein nachfolgende Elemente. Ein häufiger falscher Ansatz ist die Verwendung von „append“, um ein Element zu entfernen, wie im folgenden Beispiel zu sehen ist:
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} for i := range a { // BAD if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
Diese Methode funktioniert nicht richtig, da die Schleife die verschobenen Elemente nicht berücksichtigt. Um Elemente während der Iteration ordnungsgemäß zu entfernen, können Sie entweder eine Abwärtsschleife verwenden oder eine alternative Methode verwenden, die ständige Kopiervorgänge vermeidet.
Abwärtsschleife
Eine Abwärtsschleife iteriert umgekehrte Reihenfolge, beginnend mit dem letzten Element. Mit diesem Ansatz können Sie Elemente entfernen, ohne Schleifenvariablen manuell dekrementieren zu müssen:
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
Alternative Methode für viele Entfernungen
Wenn Sie eine große Anzahl von entfernen müssen Elemente kann die Verwendung von „append“ aufgrund übermäßigen Kopierens ineffizient sein. Ein alternativer Ansatz besteht darin, ein neues Segment zu erstellen und nur die nicht entfernbaren Elemente zu kopieren:
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} b := make([]string, len(a)) copied := 0 for _, s := range(a) { if !conditionMeets(s) { b[copied] = s copied++ } } b = b[:copied]</code>
In-Place-Entfernung für viele Entfernungen (allgemeiner Zweck)
Bei einer In-Place-Entfernungstechnik werden zwei Indizes beibehalten und nicht entfernbare Elemente im selben Slice zugewiesen, während entfernte Elementpositionen auf Null gesetzt werden:
<code class="go">a := []string{"abc", "bbc", "aaa", "aoi", "ccc"} copied := 0 for i := 0; i < len(a); i++ { if !conditionMeets(a[i]) { a[copied] = a[i] copied++ } } for i := copied; i < len(a); i++ { a[i] = "" // Zero places of removed elements for garbage collection } a = a[:copied]</code>
Das obige ist der detaillierte Inhalt vonWie entferne ich in Go iterativ Elemente aus einem Slice?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!