Ich möchte Elemente aus einer Sammlung in einer In-Place-Weise löschen. Betrachten Sie das folgende Snippet:An Ort und Stelle Löschen von Golang-Scheibenelementen
package main
import "fmt"
type Ints []int
func (xs Ints) Filter() {
for i := 0; i < len(xs); i++ {
if xs[i]%2 == 0 { // Or some other filtering function
xs = append(xs[:i], xs[i+1:]...)
}
fmt.Printf("i %+v\n", i)
fmt.Printf("xs %+v\n", xs)
}
}
func main() {
a := Ints([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
fmt.Printf("initial a %+v\n", a)
a.Filter()
fmt.Printf("final a %+v\n", a)
}
http://play.golang.org/p/1nL6Il2Gf1
Das überraschende Ergebnis ist: final a [1 3 5 7 9 10 10 10 10 10]
Ich frage mich, wie dies zu tun. Ich bin mir ziemlich sicher, dass der Empfänger ein Zeiger auf Ints
sein muss. Aber das bringt den Code etwas durcheinander (Hinzufügen von *xs
überall möglicherweise mit Klammern), aber noch wichtiger, es ergibt das gleiche Ergebnis.
Nur eine kleine Empfehlung, Verwendung '(* xs) = (* xs) [: filterPos: filterPos]' stattdessen die Scheibe und frei den zusätzlichen Speicher zu trimmen, könnte es ein anständiger sein Menge an Speicher mit größeren Objekten. – OneOfOne
@ OneOfOne True, es hängt davon ab, ob Sie für Geschwindigkeit oder Speicher optimieren. Ich würde eigentlich nur ein neues Stück erstellen und alles unveränderlich halten, außer es wäre ein großer Teil des Gedächtnisses. –
Richtig, hier ist, was ich meinte http://play.golang.org/p/FgeuFdr3-v – OneOfOne