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äufig falscher Ansatz ist die Verwendung von „append“, um ein Element zu entfernen, wie im folgenden Beispiel zu sehen ist:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
Diese Methode funktioniert nicht korrekt, 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:
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:]...)
}
}
Alternative Methode für viele Entfernungen
Wenn Sie eine große Anzahl von Elementen entfernen müssen, kann die Verwendung von „append“ aufgrund übermäßigen Kopierens ineffizient sein. Ein alternativer Ansatz besteht darin, ein neues Slice zu erstellen und nur die nicht entfernbaren Elemente zu kopieren:
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]
In-Place-Entfernung für viele Entfernungen (allgemeiner Zweck)
Eine In-Place-Entfernungstechnik umfasst die Verwaltung von zwei Indizes und die Zuweisung von Nicht-Entfernungen. entfernbare Elemente im selben Slice, während entfernte Elementpositionen auf Null gesetzt werden:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3