Clean Code in Go: Prinzipien für lesbaren Code

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Clean Code in Go: Prinzipien für lesbaren und wartbaren Code



Clean Code ist kein Luxus, sondern eine Notwendigkeit für jedes ernsthafte Projekt. In der Sprache Go, die für ihre Einfachheit und Prägnanz bekannt ist, sind die Prinzipien von Clean Code besonders wichtig. Schlecht geschriebener Code in Go wird schnell unlesbar und schwer zu warten, trotz aller Vorteile der Sprache. In diesem Artikel werden wir die grundlegenden Prinzipien für das Schreiben von sauberem Code in Go mit konkreten Beispielen durchgehen.



1. Korrekte Benennung: Grundlage der Lesbarkeit



In Go gilt die Regel: Je kleiner der Gültigkeitsbereich, desto kürzer der Name. Das bedeutet jedoch nicht, dass man überall einbuchstabige Variablen verwenden sollte. Betrachten wir Beispiele.



Schlecht (unlesbarer Code):

func f(x int, y int) int {    z := x + y    return z}


Gut (sauberer Code):

func Sum(a int, b int) int {    result := a + b    return result}


Wichtige Benennungsregeln in Go:

  • Variablen: Verwenden Sie camelCase (z.B. userName, totalCount)
  • Exportierte (öffentliche) Funktionen und Typen: Großbuchstaben — func CalculateTax()
  • Nicht exportierte (private): Kleinbuchstaben — func parseInput()
  • Abkürzungen: Schreiben Sie in Großbuchstaben (z.B. HTTPHandler, nicht HttpHandler)
  • Vermeiden Sie ungarische Notation: Schreiben Sie nicht strName oder intCount — der Typ ist ohnehin klar


2. Fehlerbehandlung: explizit und prägnant



Go verwendet keine Ausnahmen — Fehler werden als Werte zurückgegeben. Sauberer Code erfordert die explizite Behandlung jedes Fehlers. Ignorieren Sie sie nicht!



Schlecht (Fehler ignorieren):

file, _ := os.Open("data.txt")// Fehler verloren!


Gut (explizite Behandlung):

file, err := os.Open("data.txt")if err != nil {    log.Fatalf("Datei konnte nicht geöffnet werden: %v", err)}defer file.Close()


Zusätzliche Tipps:

  • Überprüfen Sie immer err != nil direkt nach dem Funktionsaufruf
  • Verwenden Sie defer zum Schließen von Ressourcen
  • Erstellen Sie eigene Fehlertypen mit fmt.Errorf("Kontext: %w", err)
  • Verwenden Sie keine Panik (panic) für normale Fehler — das ist eine Ausnahmesituation


3. Funktionen: kurz und mit einer Verantwortung



Das Single Responsibility Principle gilt auch für Funktionen. Jede Funktion sollte nur eine Sache tun.



Schlecht (Funktion macht zu viel):

func ProcessUserData(userID int) (string, error) {    // 1. Verbindung zur DB    db, _ := sql.Open("postgres", "...")    // 2. Datenabfrage    row := db.QueryRow("SELECT name, email FROM users WHERE id = ?", userID)    // 3. Formatierung    var name, email string    row.Scan(&name, &email)    result := fmt.Sprintf("Name: %s, Email: %s", name, email)    // 4. E-Mail senden (Seiteneffekt!)    sendEmail(email, "Begrüßung")    return result, nil}


Gut (Aufteilung in kleine Funktionen):

func GetUserName(db *sql.DB, userID int) (string, error) {    var name string    err := db.QueryRow("SELECT name FROM users WHERE id = ?", userID).Scan(&name)    return name, err}

func FormatUserInfo(name, email string) string { return fmt.Sprintf("Name: %s, Email: %s", name, email)}

func ProcessUserData(db *sql.DB, userID int) (string, error) { name, err := GetUserName(db, userID) if err != nil { return "", fmt.Errorf("Fehler beim Abrufen des Benutzers: %w", err) } email, _ := getUserEmail(db, userID) /

Blogs

Buchempfehlungen