Wie entferne ich in Go iterativ Elemente aus einem Slice?

DDD
Freigeben: 2024-10-30 21:07:30
Original
567 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!