Heim >Backend-Entwicklung >Golang >Wie entferne ich Elemente effizient aus einem Slice in einer Schleife in Go?

Wie entferne ich Elemente effizient aus einem Slice in einer Schleife in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 06:21:02686Durchsuche

How to Efficiently Remove Elements from a Slice in a Loop in Go?

In-Place-Elemententfernung innerhalb einer Slice-Schleife

Problem:

Zugriff auf Slice-Elemente von i innerhalb einer range for-Schleife und deren Entfernung mit append() ist problematisch. Das Erhöhen der Schleifenvariablen (i) kann nach dem Entfernen nachfolgende Elemente überspringen, was zu einer unvollständigen Verarbeitung führt.

Best Practices:

1. Manuelle Dekrementierung von Schleifenvariablen

Verwenden Sie eine reguläre for-Schleife mit manueller Schleifenvariable (i), die dekrementiert wird, wenn ein Element entfernt wird:

<code class="go">for i := 0; i < len(a); i++ {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
        i--
    }
}

2. Abwärtsschleife

Alternativ können Sie eine Abwärtsschleife verwenden, um eine manuelle Dekrementierung zu vermeiden:

<code class="go">for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}</code>

3. Kopieren nicht entfernbarer Elemente

Wenn zahlreiche Elemente entfernt werden müssen, sollten Sie erwägen, nicht entfernbare Elemente in ein neues Segment zu kopieren, um die Effizienz zu verbessern:

<code class="go">b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]</code>

4. Kopieren und Nullen vor Ort

Beim allgemeinen Entfernen vor Ort behalten Sie zwei Indizes bei und weisen nicht entfernbare Elemente zu, während Sie entfernte Elementräume auf Null setzen:

<code class="go">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
}
a = a[:copied]</code>

Das obige ist der detaillierte Inhalt vonWie entferne ich Elemente effizient aus einem Slice in einer Schleife in Go?. 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