go / intermediate
Snippet
Verstehen von gemeinsam genutztem Speicher in Slice-Headern
Slices in Go werden per Wert übergeben, was bedeutet, dass der Slice-Header (Länge, Kapazität und Zeiger auf das zugrunde liegende Array) kopiert wird. Das Modifizieren von Elementen ändert somit das ursprüngliche Array, aber ein Append kann eine Neuzuweisung auslösen oder die lokale Länge ändern, wodurch die Slice-Länge des Aufrufers unverändert bleibt.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package mainimport "fmt"func updateValues(s []int) {s[0] = 42s = append(s, 99)fmt.Println("Inside function:", s)}func main() {original := []int{1, 2, 3}updateValues(original)fmt.Println("Outside function:", original)}
Erklärung
1
func updateValues(s []int) {
Erhält eine Kopie des Slice-Headers, der auf das ursprüngliche zugrunde liegende Array verweist.
2
s[0] = 42
Verändert das zugrunde liegende Array über den kopierten Zeiger, was sich auf den Aufrufer auswirkt.
3
s = append(s, 99)
Fügt einen neuen Wert hinzu, was lokal die Länge ändert oder den Speicher neu zuweist.