Warum wird der Inhalt des Slice in GO nicht geändert?
Ich dachte, dass in der GO-Sprache Slices als Referenz übergeben werden. Aber warum ändert der folgende Code den Inhalt von Slice c nicht? Vermisse ich etwas Danke dir.
package main
import (
"fmt"
)
func call(c []int) {
c = append(c, 1)
fmt.Println(c)
}
func main() {
c := make([]int, 1, 5)
fmt.Println(c)
call(c)
fmt.Println(c)
}
Das gedruckte Ergebnis ist:
[0] [0 1] [0]
während ich erwartet hatte
[0] [0 1] [0 1]
Die Länge des Slice wird im Slice-Header beibehalten, der nicht als Referenz übergeben wird. Sie können sich ein Slice als eine Struktur vorstellen, die einen Zeiger auf das Array, eine Länge und eine Kapazität enthält.
Wenn Sie an das Slice angehängt haben, haben Sie den Index 1 im Datenarray geändert und dann die Länge im Slice-Header erhöht. Bei Ihrer Rückkehr hatte c
die Hauptfunktion eine Länge von 1 und druckte so die gleichen Daten.
Der Grund, warum Slices auf diese Weise funktionieren, besteht darin, dass mehrere Slices auf dieselben Daten verweisen können. Beispielsweise:
x := []int{1,2,3}
y := x[:2] // [1 2]
z := x[1:] // [2 3]
Alle drei dieser Slices zeigen auf überlappende Daten im selben zugrunde liegenden Array.