Go-Anfängerfallen: 5 Fehler, die Code zur Hölle machen

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

Warum Go einfach erscheint, aber Anfänger überfordert?

\n\n

Go (oder Golang) ist eine Sprache, die mit einem Ziel entwickelt wurde: damit Programmierer weniger leiden. Minimale Syntax, eingebaute Nebenläufigkeit, schnelle Kompilierung – es scheint, als könnte man es in einer Woche lernen. Und ja, man kann es lernen. Aber „guten Code schreiben“ und „Code in Go schreiben“ sind zwei verschiedene Geschichten.

\n\n

Anfänger bringen oft Gewohnheiten aus Python, JavaScript oder Java mit und versuchen, sie auf Go zu übertragen. Das Ergebnis sind schwer zu findende Bugs, Laufzeit-Panik und das Gefühl, dass „Go irgendwie kaputt ist“. Spoiler: Go ist nicht kaputt. Es denkt nur anders.

\n\n

In diesem Artikel analysieren wir die 5 häufigsten Fehler beim Lernen von Go. Wenn Sie gerade erst anfangen – lesen Sie aufmerksam. Wenn Sie bereits in Go schreiben – überprüfen Sie, ob Sie sie immer noch machen.

\n\n

Fehler Nr. 1: Ignorieren von Fehlern (und eine Angewohnheit aus Python)

\n\n

In Python oder JavaScript sind Sie es gewohnt, dass eine Funktion ein Ergebnis zurückgeben oder eine Ausnahme auslösen kann. Sie umschließen den Aufruf mit try/catch und leben ruhig. In Go ist alles anders: Es gibt keine Ausnahmen. Es gibt nur Rückgabewerte, und einer davon ist der Fehler.

\n\n

Der häufigste Anfängerfehler ist, result, _ := someFunc() zu schreiben und den Fehler zu vergessen. Oder, noch schlimmer, ihn einfach nicht zu überprüfen:

\n\n
// SCHLECHT: Fehler wird ignoriert\nfile, _ := os.Open("config.yaml")\n// Wenn die Datei nicht existiert – file == nil, und die nächste Zeile stürzt mit einer Panik ab\ndefer file.Close()\n
\n\n

In Go ist ein Fehler nichts Schreckliches. Es ist nur ein Wert. Man muss ihn überprüfen. Immer. Ohne Ausnahme.

\n\n

Wie macht man es richtig?

\n\n
// GUT: Fehler sofort überprüfen\nfile, err := os.Open("config.yaml")\nif err != nil {\n    log.Fatalf("Konnte Datei nicht öffnen: %v", err)\n}\ndefer file.Close()\n
\n\n

Das ist keine Paranoia. Das ist Disziplin. Go lehrt Sie, sorgfältig zu sein. Wenn Sie einen Fehler in der Produktion ignorieren – bereiten Sie sich darauf vor, dass um 3 Uhr morgens ein Dienst ausfällt und in den Logs Stille herrscht.

\n\n

Tipp: Verwenden Sie niemals _ für einen Fehler, es sei denn, Sie sind sich zu 100% sicher, dass er niemals auftreten wird. Und solche Situationen gibt es in echtem Code fast nie.

\n\n

Fehler Nr. 2: Panik, wo ein Fehler hingehört

\n\n

Go hat einen Mechanismus panic und recover. Anfänger verwechseln sie oft mit Ausnahmen und beginnen bei jedem Problem eine Panik auszulösen. Das ist ein Fehler.

\n\n

panic ist ein Notstopp des Programms. Es ist für Situationen gedacht, in denen eine Fortsetzung unmöglich ist: zum Beispiel das Dereferenzieren eines Nullzeigers oder ein Array-Index außerhalb der Grenzen. panic für die Geschäftslogik zu verwenden, ist ein Unding.

\n\n
// SCHLECHT: Panik statt Fehler\nfunc divide(a, b int) int {\n    if b == 0 {\n        panic("Division durch Null!")\n    }\n    return a / b\n}\n
\n\n

Der richtige Ansatz ist, einen Fehler zurückzugeben:

\n\n
// GUT: Fehler zurückgeben\nfunc divide(a, b int) (int, error) {\n    if b == 0 {\n        return 0, fmt.Errorf("Division durch Null")\n    }\n    return a / b, nil\n}\n
\n\n

Verwenden Sie panic nur für wirklich kritische Situationen. Alles andere sind Fehler. Go gibt Ihnen error nicht ohne Grund.

\n\n

Fehler Nr. 3: Falsche Arbeit mit Goroutinen und fehlende Synchronisation

\n\n

Goroutinen sind wohl die coolste Funktion von Go. Aber sie ist auch die gefährlichste für Anfänger. Typisches Bild: Sie starten 1000 Goroutinen, schreiben in eine gemeinsame Variable – und erhalten einen Data Race.

\n\n
// SCHLECHT: Data Race\nvar counter int\nfor i := 0; i < 1000; i++ {\n    go func() {\n        counter++ // unsicher!\n    }()\n}\ntime.Sleep(time.Second)\nfmt.Println(counter) // Ergebnis unvorhersehbar\n
\n\n

Warum ist das ein Problem? Weil counter++ keine atomare Operation ist. Sie besteht aus Lesen, Erhöhen und Schreiben. Zwei Goroutinen können denselben Wert lesen, erhöhen

Blogs

Buchempfehlungen