go / intermediate
Snippet
Verhindern von Speicherlecks beim Slicen von Arrays mit copy
Das Slicen eines Slices (z.B. numbers[:2]) behält die Referenz auf das gesamte zugrunde liegende Array im Speicher, was dessen Bereinigung durch den GC verhindert. Die Verwendung von copy kopiert nur die benötigte Teilmenge in ein neues, kleineres Slice, wodurch der große Speicherblock freigegeben wird.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package mainimport "fmt"func getFirstTwo(numbers []int) []int {res := make([]int, 2)copy(res, numbers[:2])return res}func main() {largeSlice := make([]int, 1000000)largeSlice[0] = 42largeSlice[1] = 99smallSlice := getFirstTwo(largeSlice)fmt.Println(smallSlice)}
Erklärung
1
res := make([]int, 2)
Erstellt ein brandneues Slice mit der exakt benötigten Größe für die Teilmenge.
2
copy(res, numbers[:2])
Kopiert die Elemente vom Quell-Slice in das Ziel-Slice, wodurch sie vom großen zugrunde liegenden Array entkoppelt werden.
3
return res
Gibt das neue kleine Slice zurück, sodass das große Quell-Slice vom Garbage Collector bereinigt werden kann.