Skip to main content
Entwickler Themen
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

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.

Interfaces nicht zu früh erfinden

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.

A little copying is better than a little dependency

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.

Komposition statt Vererbung

Go hat keine Typvererbung. Structs halten Collaborators; kleine Interfaces werden implizit erfüllt.

Embedding: nützlich, in öffentlichen APIs vorsichtig

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.

init() sparsam

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.

Leere Slices: lieber nil

var t []T       // bevorzugt (nil)
t := []T{}      // nur wenn non-nil nötig (z. B. JSON [] statt null)

Wo Quellen auseinandergehen

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

Was hier nicht drinsteht

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.