Heim > Backend-Entwicklung > Golang > Go-Zeiger: Was ist der Unterschied zwischen „&' (Adresse von) und „*' (Dereferenzierung)?

Go-Zeiger: Was ist der Unterschied zwischen „&' (Adresse von) und „*' (Dereferenzierung)?

Susan Sarandon
Freigeben: 2024-12-02 18:59:09
Original
244 Leute haben es durchsucht

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

&- und *-Zeiger

In Go kann die Übergabe von Variablen als Funktionsargumente manchmal Compilerfehler auslösen, die durch die Verwendung von Zeigern behoben werden können. Die Unterscheidung zwischen &- und *-Zeigern führt jedoch oft zu Verwirrung. Ziel dieses Artikels ist es, die Unterschiede und Verwendungsszenarien für beide Zeigertypen zu verdeutlichen.

Behebung des Fehlers

In Ihrem Beispiel ist der Fehler wahrscheinlich auf die Nichtübereinstimmung zwischen dem erwarteten und dem tatsächlichen Argumenttyp zurückzuführen Variable übergeben. Die Dekodierfunktion erfordert eine Adresse oder einen Zeiger auf eine Benutzerstruktur, aber Sie übergeben den Wert direkt. Um dieses Problem zu lösen, können Sie den &-Operator verwenden, um die Adresse der Benutzervariablen abzurufen:

if err := decoder.Decode(&u); err != nil {
    http.Error(rw, "could not decode request", http.StatusBadRequest)
    return
}
Nach dem Login kopieren

Zeiger verstehen

Zeiger sind Variablen, die Adressen anderer Variablen enthalten. Der &-Operator gibt die Adresse einer Variablen zurück, während der *-Operator uns den Zugriff auf den Wert an dieser Adresse ermöglicht.

Im obigen Beispiel gibt &u die Adresse der Benutzerstruktur an, die dann an die übergeben wird Funktion dekodieren, die einen Zeiger erwartet.

Wenn Sie jedoch die Benutzerinstanz erstellt hätten mit:

u := new(User)
Nach dem Login kopieren

Dann wären Sie bereits ein Zeiger, und Der &-Operator wäre nicht erforderlich. Sie können auch explizit einen Zeiger erstellen, indem Sie Folgendes verwenden:

var u *User
Nach dem Login kopieren

Unterschied zwischen & und *

Der Hauptunterschied zwischen & und * besteht darin, dass * eine Umleitung auf den an der Adresse gespeicherten Wert darstellt. while & gibt die Adresse zurück selbst.

Beispiel:

var y int
var pointerToY *int
var pointerToPointerToInt **int

y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY
Nach dem Login kopieren

Jetzt:

  • y hält den Wert 10.
  • *pointerToY leitet zu y um und gibt seinen Wert 10 aus.
  • &y gibt die Adresse von zurück y.
  • &pointerToY gibt die Adresse von pointerToY zurück.
  • &pointerToPointerToInt gibt die Adresse von pointerToPointerToInt zurück.
  • **pointerToPointerToInt gibt den Wert 10 aus, da es zweimal umleitet, um zu y zu gelangen.

Nutzung Szenarien

& (Adress-of-Operator):

  • Um die Adresse einer Variablen an eine Funktion zu übergeben.
  • Um die zu erhalten Adresse vor der Zuweisung zu einem Zeiger.
  • Um zwei zu vergleichen Zeiger.

Beispiel:

func swap(x, y *int) {
    *x, *y = *y, *x
}
Nach dem Login kopieren

* (Dereferenzierungsoperator):

  • Zu Greifen Sie auf den an einer Adresse gespeicherten Wert zu.
  • Um einer Adresse einen Wert zuzuweisen Zeiger.
  • Um zwei Zeiger zu vergleichen.

Beispiel:

var p *int

*p = 10
Nach dem Login kopieren

Schlussfolgerung:

Das Verständnis von &- und -Zeigern ist in Go für eine effiziente Variablenverarbeitung und die Behebung von Compilerfehlern von entscheidender Bedeutung. Der Hauptunterschied liegt im „Umleitungsverhalten“ von , während & die tatsächliche Adresse der Variablen zurückgibt. Durch sorgfältiges Abwägen der beabsichtigten Verwendungsszenarien können Sie Zeiger in Ihrem Go-Code effektiv für optimale Leistung und Korrektheit nutzen.

Das obige ist der detaillierte Inhalt vonGo-Zeiger: Was ist der Unterschied zwischen „&' (Adresse von) und „*' (Dereferenzierung)?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage