0 Tage Serie
go / intermediate
Snippet

Vermeiden von Speicherlecks durch Kopieren von Sub-Slices

Wenn Sie einen Teilbereich eines Slices ausschneiden (Slicing), teilt das neue Slice dasselbe zugrunde liegende Array mit dem Original. Wenn ein kleiner Sub-Slice eines riesigen Slices im Speicher verbleibt, kann der Garbage Collector das große zugrunde liegende Array nicht freigeben. Das Kopieren der benötigten Daten in ein neues, kleineres Slice ermöglicht die Freigabe des großen Slices.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
import "fmt"
func getImportantData(largeData []byte) []byte {
result := make([]byte, 2)
copy(result, largeData[:2])
return result
}
func main() {
bigSlice := make([]byte, 1000000)
bigSlice[0], bigSlice[1] = 42, 99
smallSlice := getImportantData(bigSlice)
fmt.Printf("Length: %d, Capacity: %d\n", len(smallSlice), cap(smallSlice))
}
Erklärung
1
result := make([]byte, 2)
Erstellt ein neues Slice mit der Länge und Kapazität von 2 und ordnet ein separates kleines zugrunde liegendes Array zu.
2
copy(result, largeData[:2])
Kopiert nur die erforderlichen Bytes aus dem großen Slice in das neu allokierte Slice.
3
return result
Gibt das neue kleine Slice zurück, sodass der Aufrufer den Verweis auf das große Slice verwerfen kann.