7.2.7. Einfachheit und Abstraktion
Go belohnt Zurückhaltung: konkrete Typen zuerst, Interfaces beim Verbraucher, wenig Magie in init, und manchmal bewusstes Kopieren statt einer weiteren Dependency.
Ohne realistischen Consumer ist ein Interface vorzeitige Abstraktion. Zuerst konkret schreiben; extrahieren im Consumer-Package, wenn eine zweite Implementierung oder ein echtes Test-Double da ist – siehe 7.2.4. Interfaces.
Lieber 20 Zeilen lokal schreiben oder kopieren, als ein schweres Modul nur für einen Hilfshelfer einzuziehen. Das ist kein Bann gegen Module – es ist ein Urteil vor dem Import.
Go hat keine Typvererbung. Structs halten Collaborators; kleine Interfaces werden implizit erfüllt.
Embedding hebt Methoden des inneren Typs auf den äußeren. Effective Go lehrt das als Kompositionstechnik. Uber warnt vor Embedding in öffentlichen Structs: Implementation leakt, die eingebettete API friert ein, godoc wird unruhig. Für exportierte Typen lieber explizite Forwarding-Methoden; intern ist Embedding oft in Ordnung.
Explizites Setup aus main oder Konstruktoren ist klarer als Package-init mit I/O oder Env. Wenn init unvermeidbar: deterministisch, reihenfolgeunabhängig, ohne I/O/Env und ohne Kopplung an andere inits.
var t []T // bevorzugt (nil)
t := []T{} // nur wenn non-nil nötig (z. B. JSON [] statt null)
| Thema | Official / Google | Uber / andere | Praktische Haltung |
|---|---|---|---|
| Panic | Effective Go erlaubt Unmögliches | Produktion: vermeiden | Libraries: error; Panic für echte Invarianten / Must bei Init |
| Channel-Puffer | Beispiele mit Puffer | eher 0 oder 1 | Puffer begründen; Backpressure designen |
| Öffentliches Embedding | in Effective Go gelehrt | in exportierten Structs meiden | intern ok; öffentlich konservativ |
| Extra-Linter | gofmt + go vet |
Community-Bundles | Baseline = fmt + vet; mehr = Teamwahl |
| „Clean Code“-Buch | kein Go-Primärstandard | — | Idiome aus Go-Docs, nicht aus dem Buch importieren |
| Max. Funktionslänge | kein hartes N | — | nach Semantik schneiden, nicht nach Zeilenquota |
| Fehler einmal behandeln | dünn auf go.dev | starke Uber-Regel | sinnvoller Default, keine Sprachnorm |
Modul-Versionierung und Dependency-Hygiene jenseits von „copy vs. dependency“ gehören zu Using Go Modules. Repo-Layout (internal/, cmd/) ist Konvention, nicht Stil-Kapitel. Mikro-Optimierungen (strconv statt fmt) kommen nach Klarheit, nicht davor.
Diese Seite gehört zu 7.2. Clean Code.