Der Leitfaden beschreibt Best Practices für die Go-Entwicklung bei Google, einschließlich Namenskonventionen, strukturierter Fehlerbehandlung, Dokumentationsstandards, Variablendeklaration, Teststrategien und Schnittstellendesign. Er betont die Vermeidung unnötiger Redundanzen, die konsequente Nutzung von Fehlerverkettung (%w) und Sentinel-Werten, die Minimierung globaler Zustände zugunsten der Test-Hermetik sowie den Verzicht auf verfrühte oder überflüssige Interfaces. Ziel ist es, wartbaren, performanten und idiomatischen Go-Code zu verfassen.
Wichtigste Punkte
Namen und Redundanzvermeidung: Funktions- und Methodennamen sollten Paketnamen, Empfängertypen, Parameter- und Rückgabetypen nicht wiederholen. Getter sollten das Präfix Get vermeiden und nomenähnlich benannt sein.
Test-Doppelgänger und Test-Helfer: Test-Helfer-Pakete erhalten standardmäßig den Suffix test (z. B. creditcardtest). Stubs und Mocks werden nach ihrem Verhalten oder Typ benannt (z. B. AlwaysCharges, StubService). t.Helper() ist in Setup-Funktionen für eine präzise Fehlerzuweisung zwingend erforderlich.
Variablen und Shadowing: Vermeiden Sie unbeabsichtigtes Shadowing (Deklaration einer neuen Variable mit := in einem Block, die eine äußere Variable verdeckt). Nutzen Sie Nullwert-Deklarationen (var) für leere Initialisierungen oder Unmarshalling. Bevorzugen Sie := für Initialisierungen mit Werten ungleich Null.
Strukturierte Fehlerbehandlung: Fehler sind Werte und sollten für programmatische Prüfungen via errors.Is und errors.As strukturiert sein (Sentinel-Werte oder benutzerdefinierte Typen wie os.PathError). Das Verb %w in fmt.Errorf dient der Fehlerverkettung (vorzugsweise am Ende, außer bei Sentinel-Fehlern am Anfang). String-Matching auf Fehlermeldungen ist untersagt.
Dokumentation und Nebenläufigkeit: Dokumentieren Sie nicht-offensichtliche Parameter, Kontextabbrüche, Bereinigungsanforderungen (z. B. Stop()) und Nebenläufigkeitssicherheiten. Schreibgeschützte Operationen gelten standardmäßig als sicher für parallele Routinen, mutierende Operationen nicht.
Funktionsoptionen: Komplexe Funktionssignaturen sollten entweder über Options-Strukturen (z. B. ReplicationOptions) oder funktionale, variadische Optionen (ReplicationOption) übersichtlich gestaltet werden.
Vermeidung globaler Zustände: Globale Paketvariablen und Singleton-Muster sind zu vermeiden, da sie die Test-Hermetik, Parallelität und Ausführungsreihenfolge beeinträchtigen. Abhängigkeiten sollten stattdessen explizit injiziert werden.
Schnittstellen (Interfaces): Befolgen Sie das Prinzip „Akzeptiere Interfaces, gib konkrete Typen zurück“. Definieren Sie Interfaces minimalistisch und erst bei tatsächlichem Bedarf (mehrere Implementierungen oder Zirkulärabhängigkeiten), wobei der Konsument das Interface definiert.
Diskussions-Highlights
Keine Kommentare vorhanden: Zum vorliegenden Hacker-News-Einsenden waren zum Zeitpunkt der Abfrage keine Kommentare im Diskussionsstrang vorhanden.
Glossar
Go: Eine von Google entwickelte, kompilierte Programmiersprache mit Fokus auf Einfachheit, Nebenläufigkeit und hohe Leistung.
Test Double (Test-Doppelgänger): Ein Oberbegriff für Test-Zwillinge wie Stubs, Fakes, Mocks und Spys, die reale Komponenten oder externe Abhängigkeiten in Tests isoliert ersetzen.
Sentinel Error (Sentinel-Fehler): Ein vordefinierter, globaler Fehlerwert, der zur programmatischen Identifikation spezifischer Fehlerzustände (z. B. mittels errors.Is) dient.
Error Wrapping (Fehlerverkettung): Das Einbetten eines Ursprungsfehlers in einen neuen Fehler (mithilfe des %w-Verbs), um Kontext hinzuzufügen und gleichzeitig die Programmierbarkeit der Fehlerkette zu erhalten.
Shadowing (Namensverdeckung): Das deklarieren einer neuen Variable in einem inneren Scope, die eine gleichnamige Variable in einem äußeren Scope verdeckt.
Stomping (Variablen-Überschreibung): Die Zuweisung an eine bestehende Variable via Zuweisungsoperator (=) im selben Scope, ohne eine neue Variable anzulegen.
Zero Value (Nullwert): Der vordefinierte Standardwert für einen initialisierten, aber nicht explizit zugewiesenen Typ in Go (z. B. 0 für numerische Typen, "" für Strings, nil für Pointer, Slices und Maps).
Dependency Injection (Abhängigkeitsinjektion): Ein Entwurfsmuster, bei dem Abhängigkeiten (wie Dienste oder Konfigurationen) explizit an eine Komponente übergeben werden, anstatt sie global abzurufen.
Goroutine: Ein von der Go-Laufzeitumgebung verwalteter, extrem leichtgewichtiger Thread für die gleichzeitige Ausführung von Funktionen.
Godoc: Das offizielle Tool und Dokumentationsformat von Go zum Generieren, Anzeigen und Validieren von Code-Dokumentationen aus Quelltextkommentaren.