Heim > Backend-Entwicklung > Golang > Wie kann ich ein Slice ändern, das in Go als Funktionsargument übergeben wird?

Wie kann ich ein Slice ändern, das in Go als Funktionsargument übergeben wird?

DDD
Freigeben: 2024-12-27 05:10:14
Original
551 Leute haben es durchsucht

How Can I Modify a Slice Passed as a Function Argument in Go?

Ein Slice als Funktionsargument übergeben und das Original-Slice ändern

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}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage