go / intermediate
Snippet
Isolieren von Sub-Slices zur Vermeidung von Speicherlecks
In Go ist ein Slice ein Header, der auf ein zugrunde liegendes Array verweist. Wenn Sie einen Sub-Slice aus einem großen Slice erstellen (z. B. largeSlice[:2]), kann der Garbage Collector das zugrunde liegende Array nicht freigeben, da der neue Slice immer noch darauf verweist. Um Speicherlecks zu vermeiden, sollten Sie die benötigten Elemente in einen neuen Slice kopieren, damit das große Array freigegeben werden kann.
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 getFirstTwoElements(largeSlice []int) []int {result := make([]int, 2)copy(result, largeSlice[:2])return result}func main() {largeData := make([]int, 1000000)for i := 0; i < 1000000; i++ {largeData[i] = i}smallActiveSlice := getFirstTwoElements(largeData)fmt.Printf("Length: %d, Capacity: %d\n", len(smallActiveSlice), cap(smallActiveSlice))}
Erklärung
1
result := make([]int, 2)
Allokiert einen neuen Slice der Länge und Kapazität 2, unabhängig vom ursprünglichen großen Array.
2
copy(result, largeSlice[:2])
Kopiert die ersten zwei Elemente aus largeSlice in den neu allokierten result-Slice.
3
largeData := make([]int, 1000000)
Simuliert eine große Speicherallokation mit 1 Million Integern.
4
smallActiveSlice := getFirstTwoElements(largeData)
Erhällt den kopierten Slice, wodurch das largeData-Array direkt im Anschluss vom Garbage Collector freigegeben werden kann.