Erstellt die Funktion „append()' von Go immer ein neues Slice?

Mary-Kate Olsen
Freigeben: 2024-10-31 03:17:30
Original
665 Leute haben es durchsucht

Does Go's `append()` Function Always Create a New Slice?

Wann erstellt append() in Go ein neues Slice?

Kontext:

Die Funktion „Go append()“ wird verwendet, um ein oder mehrere Elemente an einen Slice anzuhängen, und es ist dokumentiert, dass ein neuer Slice erstellt wird, wenn die Kapazität des ursprünglichen Slice nicht ausreicht. Eine Untersuchung eines rekursiven Algorithmus, der einem Slice Elemente hinzufügt, hat jedoch gezeigt, dass über einen Kanal gesendete Slices nach dem Senden scheinbar geändert werden.

Verwirrung:

Diese Beobachtung widerspricht der Dokumentation, die darauf hinweist, dass append() ein neues Slice zurückgeben sollte. Diese Verwirrung entsteht, weil sich die append()-Dokumentation auf den Slice-Datentyp bezieht, während die eigentliche Implementierung mit Slice-Deskriptoren arbeitet.

Lösung:

Ein Slice-Deskriptor besteht aus drei Komponenten: eine Länge, eine Kapazität und einen Zeiger auf die zugrunde liegenden Daten. Wenn append() aufgerufen wird, gibt es einen neuen Slice-Deskriptor mit aktualisierter Länge und Kapazität zurück. Der Zeiger auf die zugrunde liegenden Daten bleibt jedoch derselbe.

Erklärung:

Während append() einen neuen Slice-Deskriptor zurückgibt, bleiben die tatsächlichen Daten bestehen zwischen den alten und neuen Slices geteilt. Dies liegt daran, dass die zugrunde liegenden Daten an einem separaten Speicherort gespeichert werden, auf den der Slice-Deskriptor verweist.

Beispiel:

Der folgende Code veranschaulicht dieses Verhalten:

<code class="go">package main

import "fmt"

func main() {
    s := make([]int, 0, 5)
    s = append(s, []int{1, 2, 3, 4}...)

    a := append(s, 5)
    fmt.Println(a)

    b := append(s, 6)
    fmt.Println(b)
    fmt.Println(a)
}</code>
Nach dem Login kopieren

Die Ausgabe zeigt, dass die beiden modifizierten Slices a und b dieselben zugrunde liegenden Daten wie die ursprünglichen Slices s teilen, obwohl sie unterschiedliche Länge und Kapazität haben.

Das obige ist der detaillierte Inhalt vonErstellt die Funktion „append()' von Go immer ein neues Slice?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!