Wann weist die Funktion „append()' von Golang ein neues Slice zu?

Patricia Arquette
Freigeben: 2024-11-02 03:27:30
Original
166 Leute haben es durchsucht

When Does Golang's `append()` Function Allocate a New Slice?

Wann erstellt Golang Append() ein neues Slice?

Im Gegensatz zur integrierten API-Dokumentation erstellt die Funktion append() nicht immer ein neues Slice . Dies wird durch die Kapazität des ursprünglichen Slice und die Anzahl der hinzuzufügenden Elemente bestimmt.

Im bereitgestellten Code-Snippet, in dem Kombinationen von Booleschen Werten rekursiv erstellt werden, geben die Ausrufezeichen die Slices an, von denen in den Kanal gesendet wird die AddOption-Funktion. Allerdings werden die Slices, die auf der anderen Seite in main() auftauchen, geändert.

Die Verwirrung entsteht durch die Unterscheidung zwischen dem Slice-Datentyp und seiner internen Darstellung. Der Slice-Deskriptor besteht aus zwei Ganzzahlen (Länge und Kapazität) und einem Zeiger auf die zugrunde liegenden Daten. Daher gibt append() ein neues Slice mit einem neuen Deskriptor, aber demselben Zeiger auf Daten zurück.

Dies wird im folgenden Codebeispiel veranschaulicht:

<code class="go">package main

import "fmt"

func main() {
    s := make([]int, 0, 5) // Create a slice with zero length and capacity 5
    s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers

    a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same)
    fmt.Println(a)

    b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same)
    fmt.Println(b)
    fmt.Println(a)
}</code>
Nach dem Login kopieren

Ausgabe:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]
Nach dem Login kopieren

Dies zeigt, dass sowohl a als auch b denselben Datenzeiger verwenden, da der ursprüngliche Slice noch über Kapazität verfügt. Wenn wir jedoch die Kapazität auf 4 reduzieren:

<code class="go">s := make([]int, 0, 4)</code>
Nach dem Login kopieren

Die Ausgabe wird:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]
Nach dem Login kopieren

Da das ursprüngliche Slice nicht mehr über genügend Kapazität verfügt, erstellt append() ein neues Slice mit ein neuer Datenzeiger für b.

Das obige ist der detaillierte Inhalt vonWann weist die Funktion „append()' von Golang ein neues Slice zu?. 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!