Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der Unterschied zwischen Zeigerübergabe und Wertübergabe in Golang?

Was ist der Unterschied zwischen Zeigerübergabe und Wertübergabe in Golang?

青灯夜游
青灯夜游Original
2019-12-30 11:56:213355Durchsuche

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.

Was ist der Unterschied zwischen Zeigerübergabe und Wertübergabe in Golang?

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!

Stellungnahme:
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
Vorheriger Artikel:Hat Golang Unterricht?Nächster Artikel:Hat Golang Unterricht?