Go ermöglicht die Übergabe von Parametern über Zeiger (manchmal auch Referenzen genannt) und Werte. In diesem Artikel vergleichen wir die beiden Ansätze und legen dabei besonderes Augenmerk auf die unterschiedlichen Kontexte, die die Wahl beeinflussen können.
Zeigerübergabe und Wertübergabe
Genau genommen gibt es für Go-Methoden oder -Funktionen nur eine Übergabemethode. dass es nur an Wert vorbeigeht. Jedes Mal, wenn eine Variable als Argument übergeben wird, wird eine neue Kopie der Variablen erstellt und an die aufgerufene Funktion oder Methode übergeben. Die Kopien werden an unterschiedlichen Speicheradressen zugewiesen.
Bei der Übergabe einer Variablen per Zeiger wird eine neue Kopie erstellt, die auf dieselbe Speicheradresse zeigt. Um ein Gefühl für den Unterschied zu bekommen, sehen wir uns an, wie es funktioniert.
Übergebener Wert
package main import "fmt" type Person struct { firstName string lastName string } func changeName(p Person) { p.firstName = "Bob" } func main() { person := Person { firstName: "Alice", lastName: "Dow", } changeName(person) fmt.Println(person) }
Wenn Sie den Code ausführen, erhalten Sie die folgende Ausgabe:
{Alice Dow}
Beachten Sie, dass die Funktion „changeName“ den Vornamen zwar in „Bob“ ändert ", Die Änderung hat keine Auswirkungen auf die Variable person in der Hauptfunktion. Dies liegt daran, dass die Funktion „changeName“ eine Kopie der Variablen „person“ und nicht „person“ selbst ändert.
Übergabe eines Zeigers
package main import "fmt" type Person struct { firstName string lastName string } func changeName(p *Person) { p.firstName = "Bob" } func main() { person := Person { firstName: "Alice", lastName: "Dow", } changeName(&person) fmt.Println(person) }
Das Ausführen des Codes erhält die folgende Ausgabe:
{Bob Dow}
In diesem Fall wird die Variable person in der Funktion main geändert Funktion changeName wurde geändert. Dies liegt daran, dass &person und p zwei unterschiedliche Zeiger auf dieselbe Struktur sind, die an derselben Speicheradresse gespeichert ist.
Variablen können nicht geändert werden
Wir haben keine andere Wahl, als den Wert zu übergeben. Daher kann diese Variable nachgelagert nicht geändert werden. Umgekehrt muss eine Variable, wenn eine Änderung erwartet wird, über einen Zeiger übergeben werden.
Die Variable ist eine große Struktur
Wenn die Variable eine große Struktur ist und die Leistung ein Problem darstellt, ist es am besten, die Variable per Zeiger zu übergeben. Dadurch wird vermieden, dass die gesamte Struktur im Speicher kopiert wird.
Die Variable ist eine Karte oder ein Slice
Map und Slice in Go sind Referenztypen und sollten als Wert übergeben werden.
Die Wertübergabe ist im Allgemeinen kostengünstiger
Auch wenn Go ein bisschen wie C aussieht, funktioniert sein Compiler anders. Die Analogie von C funktioniert nicht immer mit Go. Die Wertübergabe ist möglicherweise kostengünstiger als die Zeigerübergabe in Go. Dies geschieht, weil Go die Escape-Analyse verwendet, um zu bestimmen, ob die Variable sicher auf dem Stapelrahmen der Funktion zugewiesen werden kann, was möglicherweise viel kostengünstiger ist als die Zuweisung der Variablen auf dem Heap. Die Wertübergabe vereinfacht die Escape-Analyse in Go und bietet bessere Zuweisungsmöglichkeiten für Variablen.
Zusammenfassung
Der Unterschied zwischen Zeigerübergabe und Wertübergabe
1 ist eine Adresse, nicht die Daten in der Adresse. Sie überträgt weniger Daten und ist effizienter als die Wertübertragung. Im Allgemeinen können Zeiger anstelle von Wertübertragungen verwendet werden.
2. Wenn der Zeiger übergeben wird, wirkt sich die Änderung der Raumdaten, auf die der Zeiger in der aufrufenden Funktion zeigt, auf den Aufrufer aus. Da sie auf denselben Bereich zeigen, hat die Zeigerübertragung keine Auswirkungen auf die des Aufrufers Daten.
Verwandte Empfehlungen: Golang-Tutorial
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Zeigerübergabe und Wertübergabe in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!