Die Top 5 Fehler von Go-Anfängern und wie man sie vermeidet

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

Einleitung: Warum Go einfach erscheint, aber Fallstricke birgt

Go (Golang) ist eine kompilierte, statisch typisierte Sprache, die in den Tiefen von Google entwickelt wurde. Sie wird oft für ihre einfache Syntax, die integrierte Unterstützung von Nebenläufigkeit und die hohe Leistung gelobt. Doch genau diese scheinbare Einfachheit spielt Anfängern, die von dynamischen Sprachen (Python, JavaScript) oder sogar von C++ kommen, oft einen bösen Streich.

Viele Entwickler, die anfangen, in Go zu schreiben, machen immer wieder die gleichen typischen Fehler. In diesem Artikel analysieren wir die Top 5 der häufigsten Probleme, mit denen angehende Go-Entwickler konfrontiert werden, und zeigen anhand anschaulicher Codebeispiele, wie man sie behebt.



1. Ignorieren von zurückgegebenen Fehlern (Error Handling)

Problem

In Go gibt es keine Ausnahmen (try-catch). Ein Fehler ist einfach ein Wert, den eine Funktion als letztes Argument zurückgibt. Der häufigste Anfängerfehler ist es, das Ergebnis einer Variablen zuzuweisen, aber den Fehler mit einem Unterstrich _ zu ignorieren.

// SCHLECHT: Fehler wird verschlucktresult, _ := doSomething()fmt.Println(result)

Warum ist das schlecht?

Das Programm arbeitet mit ungültigen Daten weiter, was zu einer Panik, Speicherlecks oder logischen Bugs führen kann, die schwer zu finden sind.

Wie man es richtig macht

Überprüfen Sie immer den Fehler. Verwenden Sie das idiomatische Muster:

// GUT: Fehler wird behandeltresult, err := doSomething()if err != nil {    log.Printf("Fehler bei der Ausführung von doSomething: %v", err)    return // oder panic, oder andere Logik}fmt.Println(result)

Tipp: Schreiben Sie Ihren Code so, dass if err != nil zu Ihrem Reflex wird. Haben Sie keine Angst vor frühen Rückgaben (early return) – das macht den Code sauberer.



2. Verwechslung von nil und leeren Slices/Maps

Problem

In Go ist nil kein "leeres Objekt". Es ist der Nullwert für Pointer, Slices, Maps, Channels und Interfaces. Anfänger versuchen oft, Daten in eine nil-Map oder ein nil-Slice zu schreiben, was eine Panik auslöst.

// SCHLECHT: Panik beim Schreiben in eine nil mapvar m map[string]intm["key"] = 42 // panic: assignment to entry in nil map

Wie man es richtig macht

Initialisieren Sie Maps und Slices immer vor der Verwendung:

// GUT: Initialisierung mit makem := make(map[string]int)m["key"] = 42

// Oder mit einem Literalm2 := map[string]int{}m2["key"] = 42

Bei Slices ist die Situation kniffliger: In ein nil-Slice kann man lesen (es gibt ein leeres Slice zurück), aber man kann nicht per Index schreiben. Verwenden Sie append:

var s []ints = append(s, 1) // OK, erstellt ein neues Slice// s[0] = 1 // panic: runtime error: index out of range [0] with length 0


3. Falsche Verwendung von Goroutinen und Datenrennen (Data Race)

Problem

Goroutinen sind leichtgewichtige Threads. Anfänger starten oft Goroutinen und vergessen dabei, den Zugriff auf gemeinsame Daten zu synchronisieren. Dies führt zu einem Datenrennen (data race) – einem undefinierten Programmverhalten.

// SCHLECHT: Datenrennenvar counter intfor i := 0; i < 1000; i++ {    go func() {        counter++ // unsicher!    }()}time.Sleep(time.Second)fmt.Println(counter) // Ergebnis ist unvorhersehbar

Wie man es richtig macht

Verwenden Sie Mutexe (sync.Mutex) oder Channels zur Synchronisation:

// GUT: Verwendung eines Mutexvar (    counter int    mu      sync.Mutex)for i := 0; i < 1000; i++ {    go func() {        mu.Lock()        counter++        mu.Unlock()    }()}// Auf Beendigung warten (besser mit sync.WaitGroup)time.Sleep(time.Second)fmt.Println(counter) // 1000

Wichtig: Überprüfen Sie Ihren Code immer mit dem Flag -race auf Datenrennen: go run -race main.go.



4. Fehler mit z

Blogs

Buchempfehlungen