In Go erfolgt die Übergabe von Argumenten an Funktionen nach Wert, d. h. alle am Argument vorgenommenen Änderungen werden berücksichtigt innerhalb der Funktion werden nicht in der Originalvariablen widergespiegelt. Dies kann problematisch werden, wenn mit veränderlichen Datentypen wie Slices gearbeitet wird, da das Anhängen an das Slice innerhalb der Funktion keine Auswirkungen auf das ursprüngliche Slice außerhalb des Funktionsumfangs hat.
Betrachten Sie das folgende Beispiel:
nums := []int{1, 2, 3} func addToNumbs(nums []int) []int { nums = append(nums, 4) fmt.Println(nums) // []int{1, 2, 3, 4} } fmt.Println(nums) // []int{1, 2, 3}
In diesem Beispiel nimmt die AddToNumbs-Funktion eine Kopie des Nums-Slices und hängt den Wert 4 an. Dadurch wird nur die Kopie innerhalb der Funktion und das Original geändert Nums-Slice bleibt außerhalb der Funktion unverändert.
Um dieses Problem zu beheben, müssen Sie das Slice als Referenz übergeben. Eine Möglichkeit, dies zu tun, besteht darin, einen Zeiger auf das Slice zu übergeben:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
Durch die Übergabe eines Zeigers auf das Slice werden alle innerhalb der Funktion vorgenommenen Änderungen direkt im Original-Slice widergespiegelt. Die Übergabe eines Zeigers bedeutet jedoch auch, dass die Funktion das Slice auf unerwartete Weise ändern kann. Daher ist es wichtig, Zeiger sorgfältig zu verwenden.
Eine andere Alternative besteht darin, das geänderte Slice von der Funktion zurückzugeben, wie gezeigt im folgenden Beispiel:
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
In diesem Fall gibt die Validierungsfunktion das geänderte Nachrichten-Slice zurück, sodass kein Zeiger auf das Slice übergeben werden muss.
Das obige ist der detaillierte Inhalt vonWie kann ich ein Slice ändern, das in Go als Funktionsargument übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!