Slices als Argumente mit Original-Slice-Änderungen übergeben
Die Übergabe von Variablen nach Wert in Go begrenzt die Auswirkungen von Funktionsänderungen auf den Funktionsumfang. In Fällen, in denen ein Slice außerhalb der Funktion geändert werden muss, reicht die direkte Übergabe eines Slice als Argument nicht aus.
Das Verhalten der Slice-Append-Funktion
Die Append-Funktion weist zu ein neues Slice und kopiert die Elemente aus dem vorhandenen Slice, einschließlich aller innerhalb der Funktion vorgenommenen Anhänge. Der ursprüngliche Slice bleibt jedoch unberührt.
Beispiel: Rekursion auf einem akkumulierenden Slice
Das bereitgestellte Code-Snippet versucht zunächst, Validierungsnachrichten in einem Slice zu akkumulieren, das als Argument übergeben wird zu einer rekursiven Funktion. Die Änderungen der Funktion werden jedoch nicht im ursprünglichen Slice widergespiegelt.
Lösungen
Es gibt zwei Hauptlösungen für dieses Problem:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { //...Processing return messages }
Idiomatisches Go Ansatz
Die Übergabe von Zeigern an Slices ist ein idiomatischer Go-Ansatz, wenn die Funktion das ursprüngliche Slice ändern muss. Wie im Ansatz der Rückgabe von Slice gezeigt, ist es auch möglich, die Notwendigkeit von Akkumulatoren zu umgehen, indem man die geänderte Slice zurückgibt.
Leistungsüberlegungen
Die Auswirkungen der Übergabe von a auf die Leistung Zeiger im Vergleich zur Rückgabe eines Slice ist in den meisten Szenarien vernachlässigbar. Das genaue Verhalten kann jedoch je nach Compileroptimierungen und spezifischer Codeverwendung variieren.
Das obige ist der detaillierte Inhalt vonWie kann ich ein Slice ändern, das als Argument in einer Go-Funktion übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!