Golangs Slice ist eine Zeigerstruktur, die auf das zugrunde liegende Array zeigt.
Diese Struktur hat drei Attribute: 1. Zeiger auf das Array, 2.len: die Anzahl der Elemente im Slice 3.cap: die vom Slice belegte Speichermenge.
Nur wenn Sie diese drei Attribute genau verstehen, können Sie Fehler bei der Verwendung von Slice vermeiden. (Empfohlenes Lernen: go)
Variablen und Teilen richtig verstehen
Mehrere Slices können zugrunde liegende Daten und Referenzarrays gemeinsam nutzen. Einige Intervalle können sich überlappen
Das Obige ist ein Satz aus der Golang-Bibel. Ein tiefes Verständnis dieses Satzes ist für die Zeitplanprogrammierung von großer Bedeutung.
Wann werden freigegebene Daten durch andere Variablen geändert?
func f1() { a1 := []int{1,2,3,4,5,6} a2 := a1 a3 := a1[1:3] a1[1] = 999 fmt.Println("a1=",a1,"a2=",a2,"a3=",a3) }
Laufende Ergebnisse
a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3] Process finished with exit code 0
Wir sehen deutlich, dass Daten geteilt werden. a1 wird zu diesem Zeitpunkt geändert, beide Variablen werden geändert
Wann wird es nicht geändert
func f2() { a1 := []int{1,2,3,4,5,6} a2 := a1 a3 := a1[1:3] a2 = append(a2,888) a1[1] = 999 fmt.Println("a1=",a1,"a2=",a2,"a3=",a3) }
Laufergebnis
a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3] Process finished with exit code 0
Ja, obwohl a1 geändert wird, wird a2 nicht geändert. Wir wissen, dass die Append-Funktion mit einer Speicherneuzuweisung konfrontiert sein wird. Wenn also a2 angehängt wird, beansprucht es erneut Speicherplatz, kopiert das ursprüngliche Array und fügt den neuen Wert hinzu. Das heißt, wenn der Anhängevorgang ausgeführt wird, teilt sich a2 den Speicher nicht mehr mit a1.
Wenn beim Kopieren eines Slice mehrere Variablen gleichzeitig auf ein Array verweisen, müssen Sie die gemeinsame Nutzung von Daten und die Neuzuweisung von Speicher in Betracht ziehen.
Das obige ist der detaillierte Inhalt vonSo kopieren Sie ein Golang-Slice. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!