Ich denke, die ursprüngliche Antwort ist nicht genau richtig. append()
hat sowohl die Slices als auch das zugrunde liegende Array geändert, obwohl das zugrunde liegende Array geändert wurde, aber dennoch von beiden Slices gemeinsam genutzt wird.
Wie im Go Doc angegeben:
Ein Slice speichert keine Daten, sondern beschreibt nur einen Abschnitt eines zugrunde liegenden Arrays. (Verknüpfung)
Slices sind nur Wrapper-Werte um Arrays. Dies bedeutet, dass sie Informationen darüber enthalten, wie sie ein zugrunde liegendes Array aufteilen, in dem sie einen Datensatz speichern. Daher wird ein Slice standardmäßig, wenn es an eine andere Methode übergeben wird, tatsächlich als Wert anstelle von Referenz / Zeiger übergeben, obwohl immer noch dasselbe zugrunde liegende Array verwendet wird. Normalerweise werden Arrays auch als Wert übergeben, daher gehe ich davon aus, dass ein Slice auf ein zugrunde liegendes Array zeigt, anstatt es als Wert zu speichern. In Bezug auf Ihre Frage hat Ihr Slice beim Ausführen die folgende Funktion übergeben:
func Test(slice []int) {
slice = append(slice, 100)
fmt.Println(slice)
}
Sie haben tatsächlich eine Kopie Ihres Slice zusammen mit einem Zeiger auf dasselbe zugrunde liegende Array übergeben. Dies bedeutet, dass die Änderungen, die Sie an dem vorgenommen slice
haben, keinen Einfluss auf das in der main
Funktion hatten. Es ist das Slice selbst, das die Informationen darüber speichert, wie viel von einem Array es schneidet und der Öffentlichkeit zugänglich macht. Daher haben Sie append(slice, 1000)
beim Ausführen beim Erweitern des zugrunde liegenden Arrays auch die Schnittinformationen von geändert slice
, die in Ihrer Test()
Funktion privat gehalten wurden .
Wenn Sie Ihren Code jedoch wie folgt geändert haben, hat dies möglicherweise funktioniert:
func main() {
for i := 0; i < 7; i++ {
a[i] = i
}
Test(a)
fmt.Println(a[:cap(a)])
}
Der Grund dafür ist, dass Sie erweitert haben, a
indem Sie a[:cap(a)]
über das geänderte zugrunde liegende Array gesprochen haben, das durch die Test()
Funktion geändert wurde . Wie hier angegeben:
Sie können die Länge eines Slice verlängern, indem Sie es erneut in Scheiben schneiden, sofern es über eine ausreichende Kapazität verfügt. (Verknüpfung)