go / intermediate
Snippet
Direkte Slice-Filterung zur Optimierung der Speicherbelegung
Um Elemente in einem Slice zu filtern, ohne ein neues zugrundeliegendes Array zu allokieren, kann ein In-Place-Filter durchgeführt werden. Durch Beibehalten eines Index n für gültige Elemente überschreiben Sie Elemente sequenziell im selben Slice. Das Slicen des ursprünglichen Slices bis n (numbers[:n]) gibt das gefilterte Slice zurück, was Speicherplatz und Leistung optimiert.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
package mainfunc filterInPlace(numbers []int, keep func(int) bool) []int {n := 0for _, val := range numbers {if keep(val) {numbers[n] = valn++}}return numbers[:n]}
Erklärung
1
n := 0
Initialisiert einen Schreibzeiger n, um die Anzahl und Position der Elemente zu verfolgen, die dem Filter entsprechen.
2
numbers[n] = val
Überschreibt das Element am aktuellen Schreibzeiger n mit dem gültigen übereinstimmenden Wert.
3
n++
Erhöht den Schreibzeiger, um sich auf das nächste übereinstimmende Element vorzubereiten.
4
return numbers[:n]
Gibt einen Slice-Header zurück, der auf dasselbe Array zeigt, aber auf die übereinstimmenden Elemente verkürzt ist.