Heim >Backend-Entwicklung >Golang >Wie wirkt sich append() auf Slices in Go aus?

Wie wirkt sich append() auf Slices in Go aus?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-15 13:54:02716Durchsuche

How Does append() Affect Slices in Go?

Verstehen des Verhaltens von append() auf Slices

Trotz der anfänglichen Annahmen von Slice als Zeiger zeigt der bereitgestellte Code, dass das Anhängen () Der Vorgang wirkt sich nicht direkt auf das ursprüngliche Slice aus. Dies liegt daran, dass in Go alles als Wert übergeben wird, einschließlich Slices. Wenn Sie also ein Slice an eine Funktion übergeben oder es einer neuen Variablen zuweisen, übergeben Sie nur eine Kopie des Slice-Headers.

Der Slice-Header enthält Informationen wie die Länge des Slice, seine Kapazität, und ein Zeiger auf das zugrunde liegende Array. Wenn die append()-Operation für ein Slice ausgeführt wird, wird bei Bedarf ein neues Array zugewiesen, um die neuen Elemente aufzunehmen. Der Slice-Header wird dann aktualisiert, um auf das neue Array zu verweisen, und die neuen Elemente werden kopiert. Dieser neue Slice-Header wird als Ergebnis des append()-Aufrufs zurückgegeben.

Im Beispielcode weisen Sie den Rückgabewert der append()-Operation der Variable „slice1“ zu. Das bedeutet, dass Slice1 nun auf ein anderes Array zeigt als Slice. Alle an den Elementen von Slice1 vorgenommenen Änderungen werden nicht in Slice widergespiegelt und umgekehrt.

Um das Verhalten zu erreichen, bei dem sowohl Slice als auch Slice1 auf dasselbe Array verweisen, müssten Sie einen Zeiger auf ein Slice verwenden statt einer Scheibe selbst. Zum Beispiel:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slicePtr := &slice
    slice1 := *slicePtr
    slice1[0] = 10000
    fmt.Println(slice)

    *slicePtr = append(*slicePtr, 100)
    (*slicePtr)[0] = 20000

    fmt.Println(slice)
}

In diesem Beispiel verweisen sowohl Slice als auch Slice1 auf dasselbe zugrunde liegende Array, sodass alle an einem vorgenommenen Änderungen im anderen sichtbar sind.

Das obige ist der detaillierte Inhalt vonWie wirkt sich append() auf Slices in Go aus?. 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