0 Tage Serie
go / intermediate
Snippet

Effiziente Slice-Filterung ohne Allokation von neuem Speicher

Das Filtern eines Slices in Go kann direkt vor Ort (in-place) erfolgen, indem das zugrunde liegende Array des Eingabe-Slices wiederverwendet wird. Dies vermeidet die Zuweisung eines neuen Slices auf dem Heap und verbessert die Speicherleistung.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main
import "fmt"
func filterEven(numbers []int) []int {
n := 0
for _, x := range numbers {
if x%2 == 0 {
numbers[n] = x
n++
}
}
return numbers[:n]
}
func main() {
nums := []int{1, 2, 3, 4, 5, 6}
filtered := filterEven(nums)
fmt.Println("Filtered:", filtered)
fmt.Println("Original backing array modified:", nums)
}
Erklärung
1
n := 0
Initialisiert einen Index-Tracker, um Elemente in dasselbe zugrunde liegende Array zu schreiben.
2
numbers[n] = x
Überschreibt das Element an Position `n` mit dem aktuell passenden Element.
3
n++
Erhöht den Index-Tracker, um sich auf das nächste passende Element vorzubereiten.
4
return numbers[:n]
Gibt einen Slice-Ausdruck zurück, der dasselbe zugrunde liegende Array bis zur Länge `n` teilt.