Top-Fehler von Anfängern in Go: 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

Top-Fehler von Go-Anfängern: Wie man sie vermeidet



Go (oder Golang) ist eine kompilierte, statisch typisierte Programmiersprache, die bei Google entwickelt wurde. Sie hat aufgrund ihrer Einfachheit, Leistung und integrierten Unterstützung für Nebenläufigkeit an Popularität gewonnen. Doch selbst mit einer so prägnanten Syntax machen Anfänger oft die gleichen Fehler. In diesem Artikel analysieren wir die Top-4 typischen Fehler von Go-Anfängern und zeigen, wie man sie vermeidet.



1. Ignorieren von zurückgegebenen Fehlern



Einer der häufigsten Fehler ist das Ignorieren von Fehlern, die von Funktionen zurückgegeben werden. In Go gibt es keine Ausnahmen (try-catch), und Fehler sind normale Werte, die explizit behandelt werden müssen. Viele Anfänger, die an andere Sprachen gewöhnt sind, weisen das Ergebnis einfach einer Variable zu und vergessen, err zu überprüfen.



Falsch:

package main

import ( "fmt" "os")

func main() { file, _ := os.Open("config.txt") // Fehler ignorieren fmt.Println(file.Name())}


Wenn die Datei nicht existiert, gerät das Programm in Panik (panic) oder arbeitet mit einem nil-Zeiger, was zu unerwartetem Verhalten führt.



Richtig:

package main

import ( "fmt" "log" "os")

func main() { file, err := os.Open("config.txt") if err != nil { log.Fatalf("Konnte Datei nicht öffnen: %v", err) } defer file.Close() fmt.Println(file.Name())}


Tipp: Überprüfen Sie err immer direkt nach dem Aufruf einer Funktion. Verwenden Sie log.Fatal oder geben Sie den Fehler im Stack nach oben weiter, aber ignorieren Sie ihn niemals.



2. Falsche Arbeit mit Goroutinen und Datenrennen



Goroutinen sind leichtgewichtige Threads in Go. Anfänger starten jedoch oft Goroutinen, ohne sich um die Synchronisation des Zugriffs auf gemeinsame Daten zu kümmern. Dies führt zu Datenrennen (data race), bei denen mehrere Goroutinen gleichzeitig in eine Variable lesen und schreiben.



Falsch:

package main

import ( "fmt" "sync")

func main() { counter := 0 var wg sync.WaitGroup

for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter++ // Datenrennen! }() } wg.Wait() fmt.Println(counter) // Ergebnis kann beliebig sein (nicht 1000)}


Richtig (mit Mutex):

package main

import ( "fmt" "sync")

type Counter struct { mu sync.Mutex value int}

func (c *Counter) Increment() { c.mu.Lock() defer c.mu.Unlock() c.value++}

func (c *Counter) Value() int { c.mu.Lock() defer c.mu.Unlock() return c.value}

func main() { counter := &Counter{} var wg sync.WaitGroup

for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() counter.Increment() }() } wg.Wait() fmt.Println(counter.Value()) // Immer 1000}


Tipp: Verwenden Sie Mutexe (sync.Mutex) oder Channels zur Synchronisation. Führen Sie Tests mit dem Flag -race aus: go test -race.



3. Verwechslung von nil-Slice und leerem Slice



In Go können Slices (slices) nil oder leer sein. Anfänger verstehen oft den Unterschied nicht, was zu Fehlern bei der Serialisierung (JSON) oder beim Übergeben von Slices an Funktionen führt.



  • Nil-Slice: deklariert als var s []int. Es hat kein zugrunde liegendes Array.
  • Leerer Slice: erstellt als s := []int{} oder make([]int, 0). Es hat ein zugrunde liegendes Array, aber die Länge ist 0.


Beispiel für Verwechslung:

package main

import ( "e

Blogs

Buchempfehlungen