Heim  >  Artikel  >  Backend-Entwicklung  >  Wie entferne ich in Go iterativ Elemente aus einem Slice?

Wie entferne ich in Go iterativ Elemente aus einem Slice?

DDD
DDDOriginal
2024-10-30 21:07:30568Durchsuche

How to Remove Elements from a Slice Iteratively in Go?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn