Übergabe per Referenz in Go: Eine praktische Anleitung
Min-jun Kim
Dev Intern · Leapcell

Key Takeaways
- Go verwendet Pass-by-Value-Semantik, aber Pointer ermöglichen referenzähnliches Verhalten.
- Verwenden Sie Pointer, wenn Sie den Originalwert ändern müssen.
- Structs und große Datentypen profitieren von der Verwendung von Pointern zur Leistungssteigerung.
Go (Golang) ist eine statisch typisierte, kompilierte Programmiersprache, die für ihre Einfachheit und Leistung bekannt ist. Ein Konzept, das Neulinge oft verwirrt, ist die Art und Weise, wie Go Funktionsargumente behandelt – insbesondere wenn es darum geht, Daten per Referenz zu übergeben.
In diesem Artikel werden wir untersuchen, was "Pass by Reference" in Go bedeutet, wie es funktioniert und wie Sie es effektiv nutzen können, um saubereren, effizienteren Code zu schreiben.
Verständnis der Parameterübergabe-Semantik von Go
Go verwendet die Pass-by-Value-Semantik für Funktionsargumente. Das bedeutet, dass Go eine Kopie dieses Wertes erstellt, wenn Sie eine Variable an eine Funktion übergeben. Wenn Sie jedoch einen Pointer übergeben (d. h. die Speicheradresse eines Wertes), können Sie den Effekt der Übergabe per Referenz erzielen.
Betrachten wir ein einfaches Beispiel:
package main import "fmt" func modify(x int) { x = 10 } func main() { a := 5 modify(a) fmt.Println(a) // Ausgabe: 5 }
Hier empfängt modify
eine Kopie von a
, sodass alle Änderungen innerhalb von modify
den Originalwert nicht beeinflussen.
Erreichen von "Pass by Reference" mit Pointern
Um die Originalvariable innerhalb der Funktion tatsächlich zu ändern, müssen Sie einen Pointer auf diese Variable übergeben:
package main import "fmt" func modify(x *int) { *x = 10 } func main() { a := 5 modify(&a) fmt.Println(a) // Ausgabe: 10 }
Erklärung:
x *int
: Deklariert, dassmodify
einen Pointer auf einenint
akzeptiert.&a
: Der Operator&
ruft die Adresse vona
ab.*x = 10
: Der Operator*
dereferenziert den Pointer, sodass Sie den Originalwert ändern können.
Wann Sie Pointer in Go verwenden sollten
Sie sollten Pointer verwenden, wenn:
- Sie den Originalwert, der an eine Funktion übergeben wurde, ändern möchten.
- Sie das Kopieren großer Structs oder Slices aus Leistungsgründen vermeiden möchten.
- Sie mit gemeinsamem Zustand arbeiten (z. B. Datenstrukturen oder Objekte, die über mehrere Funktionen hinweg geändert werden).
Hier ist ein Beispiel mit einer Struct:
type User struct { Name string Age int } func updateName(u *User) { u.Name = "Alice" } func main() { user := User{Name: "Bob", Age: 30} updateName(&user) fmt.Println(user.Name) // Ausgabe: Alice }
Häufige Fehler
-
Vergessen, den Pointer zu übergeben:
updateName(user) // Fehler: cannot use user (type User) as type *User
-
Ändern von Werten innerhalb von Slices und Maps: Go übergibt Slices und Maps per Wert, aber sie enthalten Referenzen auf zugrunde liegende Daten. In vielen Fällen können Sie also ihren Inhalt ändern, ohne Pointer zu verwenden. Beachten Sie dieses Verhalten.
Fazit
Go unterstützt zwar keine traditionelle Übergabe per Referenz wie einige andere Sprachen, bietet Ihnen jedoch durch die Verwendung von Pointern die volle Kontrolle. Wenn Sie verstehen, wie und wann Sie Pointer verwenden, können Sie effizienteren und aussagekräftigeren Go-Code schreiben.
Wenn Sie aus einer Sprache wie C, C++ oder Python kommen, wird Ihnen diese Redewendung den Umgang mit speicher- und leistungssensitiven Anwendungen in Go erleichtern.
FAQs
Nein, Go unterstützt nur die Übergabe per Wert, aber Sie können die Referenzsemantik mithilfe von Pointern simulieren.
Wenn Sie den Originalwert ändern oder das Kopieren großer Datenstrukturen vermeiden möchten.
Ja, da Slices und Maps interne Referenzen auf zugrunde liegende Daten enthalten.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Go-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Unterstützung mehrerer Sprachen
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für müheloses Setup.
- Vollständig automatisierte CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und -protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Null Betriebsaufwand – konzentrieren Sie sich einfach auf den Aufbau.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ