In Go werden Funktionsargumente als Wert übergeben, was bedeutet, dass alle an den Argumenten innerhalb der Funktion vorgenommenen Änderungen keine Auswirkungen auf das Original haben Werte außerhalb der Funktion. Dies kann beim Umgang mit Strukturen verwirrend sein, da Sie möglicherweise davon ausgehen, dass sie als Referenz übergeben werden.
Um zu verstehen, wie dies funktioniert, betrachten Sie den folgenden Codeausschnitt:
package main import ( "fmt" "runtime" ) type Something struct { number int queue chan int } func gotest(s *Something, done chan bool) { fmt.Printf("from gotest:\n&s: %p\n", &s) for num := range s.queue { fmt.Println(num) s.number = num } done <- true } func main() { runtime.GOMAXPROCS(4) s := &Something{number: 42} fmt.Printf("&s: %p\n", &s) s.queue = make(chan int) done := make(chan bool) go gotest(s, done) s.queue <- 43 close(s.queue) <-done fmt.Printf("&s: %p\n", &s) fmt.Println(s.number) // Output: 43 }
Dieser Code demonstriert Übergabe eines Strukturzeigers als Wert. In der Hauptfunktion erstellen wir eine Instanz von Something und übergeben einen Zeiger darauf an die Gotest-Funktion.
Innerhalb der Gotest-Funktion ändern wir das Zahlenfeld der Struktur und übergeben auch Nachrichten an ihren Warteschlangenkanal. Die Gotest-Funktion arbeitet mit einer Kopie des Zeigers, sodass alle von ihr vorgenommenen Änderungen keinen Einfluss auf die ursprüngliche Struktur in der Hauptfunktion haben.
Mit dem &s-Ausdruck können wir die Zeigerwerte in verschiedenen Phasen der Ausführung beobachten. Die Ausgabe zeigt Folgendes:
Dieses Verhalten steht im Einklang mit der Pass-by-Value-Semantik von Go, bei der Argumente in den Gültigkeitsbereich der Funktion kopiert werden. Wenn Sie also die ursprüngliche Struktur ändern möchten, sollten Sie einen Zeiger auf diese und nicht auf die Struktur selbst übergeben.
Das obige ist der detaillierte Inhalt vonWie wirkt sich die Pass-by-Value-Semantik von Go auf die Manipulation von Strukturzeigern aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!