Desidero eliminare elementi da una raccolta in un modo sul posto. Si consideri il seguente frammento di codice:Eliminazione in posto degli elementi della sezione Golang
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
Il risultato sorprendente è: final a [1 3 5 7 9 10 10 10 10 10]
mi chiedo come fare questo. Sono abbastanza sicuro che il ricevitore debba essere un puntatore a Ints
. Ma ciò incasina un po 'il codice (aggiungendo *xs
ovunque possibilmente con parentesi) ma, soprattutto, produce lo stesso risultato.
Solo una piccola raccomandazione, l'uso '(* xs) = (* xs) [: filterPos: filterPos]' invece di tagliare la fetta e libera la memoria aggiuntiva, potrebbe essere un dignitoso quantità di memoria con oggetti più grandi. – OneOfOne
@OneOfOne true, dipende se si sta ottimizzando la velocità o la memoria. In realtà creerei solo una nuova sezione e manterrai tutto immutabile, a meno che non si tratti di un'enorme quantità di memoria. –
Vero, ecco cosa intendevo http://play.golang.org/p/FgeuFdr3-v – OneOfOne