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!