Einleitung: Warum sauberer Code in Go kein Luxus, sondern eine Notwendigkeit ist
\n\nGo (oder Golang) ist eine Sprache, die auf den ersten Blick einfach und sogar langweilig erscheint. Es gibt keine Generics (bis Version 1.18), keine Klassen, keine virtuelle Maschine. Aber genau diese Minimalismus macht es zum idealen Schlachtfeld für sauberen Code. Wenn Sie in Go schreiben und Ihr Projekt beginnt, wie Spaghetti aus goroutine und unlesbaren switch-Anweisungen auszusehen, verlieren Sie den Hauptvorteil der Sprache: Entwicklungsgeschwindigkeit und einfache Wartung.
In diesem Artikel analysieren wir 7 praktische Regeln, die Ihnen helfen, idiomatischen Go-Code zu schreiben, der nicht nur für den Compiler, sondern auch für Ihre Kollegen (und für Sie selbst in einem Monat) verständlich ist. Los geht's!
\n\n1. Korrekte Variablennamen: kurz und klar
\n\nIn Go ist es üblich, kurze, aber aussagekräftige Namen zu verwenden. Im Gegensatz zu Java, wo ListOfUserOrders normal ist, sehen Sie in Go orders oder sogar os. Warum? Weil Go eine Sprache zum Lesen von Code ist, nicht zum Schreiben.
Grundlegende Regeln der Namensgebung in Go
\n- \n
- Lokale Variablen: 1-2 Buchstaben für offensichtliche Dinge (
i– Zähler,s– Zeichenkette). \n - Pakete: ein Wort, Kleinbuchstaben, keine Unterstriche (
http,fmt). \n - Exportierte Bezeichner: beginnen mit einem Großbuchstaben (
GetUser). \n - Akronyme: werden in einheitlicher Groß-/Kleinschreibung geschrieben (
HTTP,URL, nichtHttpoderUrl). \n
// Schlecht\nfunc GetUserDataFromDatabaseByID(userID string) (UserData, error) {\n var userDataFromDb UserData\n // ...\n return userDataFromDb, nil\n}\n\n// Gut\nfunc GetUser(id string) (User, error) {\n var u User\n // ...\n return u, nil\n}\n\nTipp: Wenn ein Variablenname mehr als 2 Wörter umfasst, machen Sie es wahrscheinlich zu kompliziert.
\n\n2. Formatierung: Vertrauen Sie gofmt
\n\nIn Go gibt es keine "Style-Kriege". Der Befehl gofmt regelt alles für Sie. Das ist keine Empfehlung – es ist der Standard. Wenn Sie gofmt nicht verwenden, schreiben Sie nicht in Go, sondern in einem "Go-Dialekt".
Was macht gofmt?
\n- \n
- Setzt Einrückungen (Tabulatoren, keine Leerzeichen). \n
- Entfernt überflüssige Zeilenumbrüche. \n
- Richtet Kommentare aus. \n
- Entfernt ungenutzte Importe (mit dem Flag
-s). \n
// Vor gofmt\nfunc add (a int,b int) int{\nreturn a+b\n}\n\n// Nach gofmt\nfunc add(a, b int) int {\n return a + b\n}\n\nIn jedem modernen Editor (VS Code, GoLand) wird gofmt automatisch beim Speichern ausgeführt. Wenn nicht, konfigurieren Sie es. Das spart Stunden bei Code-Reviews.
3. Fehlerbehandlung: Nicht ignorieren, nicht in Panik geraten
\n\nIn Go gibt es keine Ausnahmen (try-catch). Fehler sind einfach Werte, die überprüft werden müssen. Das ist eine der stärksten Seiten der Sprache, wenn Sie sie richtig nutzen.
\n\nRegeln für saubere Fehlerbehandlung
\n- \n
- Überprüfen Sie immer
error. Kein_zum Überspringen. \n - Verwenden Sie
panicnicht in Bibliothekscode. Nur wenn das Programm nicht fortgesetzt werden kann (z. B. wenn eine Konfigurationsdatei nicht geöffnet werden kann). \n - Wickeln Sie Fehler mit
fmt.Errorf("context: %w", err)(Go 1.13+). \n
// Schlecht\nfunc ReadConfig(path string) *Config {\n data, _ := ioutil.ReadFile(path) // Fehler ignorieren\n var cfg Config\n json.Unmarshal(data, &cfg)\n return &cfg\n}\n\n// Gut\nfunc ReadConfig(path string) (*Config, error) {\n data, err := ioutil.ReadFile(path)\n if err != nil {\n return nil, fmt.Errorf("read config: %w", err)\n }\n var cfg Config\n if err := json.Unma