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 mainimport "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, 99smallSlice := 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.