Heim  >  Artikel  >  Backend-Entwicklung  >  So kopieren Sie ein Golang-Slice

So kopieren Sie ein Golang-Slice

(*-*)浩
(*-*)浩Original
2019-12-17 11:24:173394Durchsuche

So kopieren Sie ein Golang-Slice

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn