In Go erfolgt die Übergabe von Argumenten an Funktionen anhand des Werts, was bedeutet, dass alle am Argument vorgenommenen Änderungen berücksichtigt werden 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 Funktionsbereichs 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 darin enthaltene Kopie geändert die Funktion, und das ursprüngliche 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 eine Weise ändern kann, die Sie möglicherweise nicht erwarten. 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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3