Heim >Backend-Entwicklung >Golang >Wann weist die Funktion „append()' von Golang ein neues Slice zu?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 03:27:30272Durchsuche

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>

Ausgabe:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]

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>

Die Ausgabe wird:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]

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!

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