Go im Vorstellungsgespräch: 9 Fallstricke und wie man sie umgeht

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 und warum ist es so schwer?

\n\n

Go (oder Golang) ist eine Sprache, die für ihre Einfachheit geliebt und für dieselbe Einfachheit gehasst wird. In Go-Vorstellungsgesprächen wird selten gefragt: „Schreibe eine Bubblesortierung“ (obwohl das auch vorkommt). Meistens erwarten Sie Aufgaben zu Nebenläufigkeit, Verständnis des Speicheraufbaus und die Fähigkeit, sauberen, idiomatischen Code zu schreiben. Wenn Sie an Python oder Java gewöhnt sind, kann Go zu streng erscheinen. Aber genau diese Strenge macht es zur idealen Sprache für Produktionssysteme.

\n\n

In diesem Artikel analysieren wir die wichtigsten Themen, die in einem Vorstellungsgespräch garantiert auftauchen. Sie erhalten nicht nur Theorie, sondern konkrete Codebeispiele und Erklärungen „unter der Haube“. Los geht's!

\n\n

1. Goroutinen und Channels: Grundlagen, die Sie auswendig kennen müssen

\n\n

Goroutinen sind keine Threads

\n

Die häufigste Frage: „Was ist der Unterschied zwischen einer Goroutine und einem OS-Thread?“. Antwort: Eine Goroutine ist leichtgewichtig (Stack ab 2 KB), wird vom Go-Scheduler und nicht vom Kernel verwaltet. Eine Million Goroutinen ist normal. Eine Million Threads würde das System zerstören.

\n\n
// Beispiel: Start von 10 Goroutinen\nfor i := 0; i < 10; i++ {\n    go func(id int) {\n        fmt.Printf("Goroutine %d arbeitet\\n", id)\n    }(i)\n}\n// Warten (schlechte Methode, nur als Beispiel)\ntime.Sleep(time.Second)\n
\n\n

Channels: Synchronisation ohne Schmerz

\n

Channels in Go sind typisierte „Röhren“ zur Datenübertragung zwischen Goroutinen. Merken Sie sich drei Regeln:

\n
    \n
  • Schreiben in einen geschlossenen Channel führt zu einer Panik.
  • \n
  • Lesen aus einem geschlossenen Channel gibt den Zero Value zurück.
  • \n
  • Ein ungepufferter Channel blockiert die Goroutine, bis ein Empfänger bereit ist.
  • \n
\n\n
// Korrekte Arbeit mit einem Channel\nch := make(chan int, 2) // gepuffert\n\nch <- 1\nch <- 2\nclose(ch)\n\nfor val := range ch {\n    fmt.Println(val) // 1, 2\n}\n
\n\n

Tipp für das Vorstellungsgespräch: Wenn nach „select“ gefragt wird, zeigen Sie ein Beispiel mit Timeout:

\n\n
select {\ncase msg := <-ch:\n    fmt.Println(msg)\ncase <-time.After(1 * time.Second):\n    fmt.Println("Timeout!")\n}\n
\n\n

2. Interfaces: Nicht nur Methoden, sondern Verträge

\n\n

In Go werden Interfaces implizit implementiert. Das bedeutet, dass eine Struktur automatisch ein Interface erfüllt, wenn sie alle benötigten Methoden besitzt. Häufig wird gefragt: „Was ist der Unterschied zwischen interface{} und any?“ — Antwort: Keiner, es sind Synonyme (seit Go 1.18).

\n\n

Typische Aufgabe im Vorstellungsgespräch

\n

Schreiben Sie eine Funktion, die io.Writer akzeptiert und einen String hineinschreibt. Dies testet das Verständnis von Interfaces aus der Standardbibliothek.

\n\n
func WriteHello(w io.Writer) {\n    _, err := w.Write([]byte("Hello, Go!"))\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n\n// Verwendung:\nvar buf bytes.Buffer\nWriteHello(&buf)\nfmt.Println(buf.String()) // Hello, Go!\n
\n\n

Fallstrick: Alle Interfaces in Go sind zwei Zeiger (Typ + Wert). Ein leeres Interface (interface{}) ist nicht gleich nil, wenn es (*int)(nil) enthält. Merken Sie sich das, um bei der Frage zu nil != nil nicht durchzufallen.

\n\n

3. Generics: Neu, aber bereits obligatorisch

\n\n

Seit Go 1.18 sind Generics Teil der Sprache. Im Vorstellungsgespräch könnte man Sie bitten, eine generische Funktion zu schreiben. Zum Beispiel eine Funktion, die ein Slice beliebigen Typs akzeptiert und dessen Länge zurückgibt (trivial) oder das Maximum findet.

\n\n
// Generische Funktion zur Maximumsuche\nfunc Max[T constraints.Ordered](a, b T) T {\n    if a > b {\n        return a\n    }\n    return b\n}\n\n// Verwendung:\nfmt.Println(Max(10, 20))     // 20\nfmt.Println(Max(3.14, 2.71)) // 3.14\n
\n\n

Beachten Sie das Paket constraints — es wird häufig in Fragen verwendet. Aber denken Sie daran: Seit Go 1.21 wurde es durch das eingebaute cmp.Ordered ersetzt.

\n\n

4. Fehlerbehandlung: Ignorieren Sie sie nicht

\n\n

In Go gibt es kein try-catch. Fehler sind Werte.

Blogs

Buchempfehlungen