Go gegen Python: Gibt es in Go die Konstruktion "if x in"?

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 vermissen Python-Programmierer "in" in Go?

\n\n

Wenn Sie aus der Python-Welt zu Go kommen, erinnern Sie sich sicher an diese magische Zeile: if "banana" in fruits:. Kurz, elegant, lesbar. Und dann öffnen Sie Go und fragen sich: "Does Go have 'if x in' construct similar to Python?" – genau so lautet die populärste Frage auf Stack Overflow, die tausende Aufrufe gesammelt hat.

\n\n

Spoiler: Direkten syntaktischen Zucker wie in gibt es in Go nicht. Aber das bedeutet nicht, dass die Aufgabe nicht lösbar oder schwer zu lösen ist. Im Gegenteil, in Go gibt es mehrere idiomatische Wege zur Prüfung auf Enthaltensein, jeder davon ist effizient und auf seine Weise schön.

\n\n

In diesem Artikel werden wir behandeln:

\n
    \n
  • Warum es in Go kein in gibt und wie die Sprachphilosophie dies beeinflusst hat;
  • \n
  • Wie man das Vorhandensein eines Elements in einem Slice prüft (auch mit der neuen Funktion slices.Contains);
  • \n
  • Wie die Suche in einer Map funktioniert (Spoiler: das ist der schnellste Weg);
  • \n
  • Teilstring-Suche in einem String mit strings.Contains;
  • \n
  • Wir schreiben unsere eigene universelle Wrapper-Funktion für einen "pythonischen" Stil;
  • \n
  • Wir vergleichen die Performance der Ansätze.
  • \n
\n\n

Warum will Go kein "if x in"?

\n\n

Go ist eine minimalistische Sprache. Seine Schöpfer (Rob Pike, Ken Thompson, Rob Griesemer) haben bewusst vermieden, die Syntax zu überladen. Anstatt das Schlüsselwort in hinzuzufügen, schlugen sie vor, explizite Schleifen und eingebaute Konstruktionen zu verwenden.

\n\n

Das ist kein Mangel, sondern eine Besonderheit: Sie sehen immer, was genau passiert. Zum Beispiel gibt Ihnen die Syntax value, ok := myMap[key] für eine Map nicht nur die Prüfung auf Vorhandensein, sondern auch den Wert selbst – das ist mächtiger als nur ein boolesches True/False.

\n\n

Methode 1: Suche in einem Slice (Klassiker)

\n\n

Das häufigste Szenario. Angenommen, Sie haben ein Slice von Strings und müssen prüfen, ob "Go" darin enthalten ist.

\n\n

Vor Version Go 1.21 mussten Sie die Schleife manuell schreiben:

\n\n
package main\n\nimport "fmt"\n\nfunc contains(slice []string, target string) bool {\n    for _, v := range slice {\n        if v == target {\n            return true\n        }\n    }\n    return false\n}\n\nfunc main() {\n    languages := []string{"Python", "Java", "Go", "Rust"}\n    if contains(languages, "Go") {\n        fmt.Println("Go gefunden!")\n    }\n}\n
\n\n

Dieser Code ist idiomatisches Go. Er ist explizit, schnell und verständlich. Für kleine Slices (bis zu 1000 Elementen) funktioniert diese lineare Suche hervorragend.

\n\n

Methode 1.1: Verwenden von slices.Contains (Go 1.21+)

\n\n

Ab Version Go 1.21 (veröffentlicht im August 2023) gibt es in der Standardbibliothek das Paket slices mit der fertigen Funktion Contains. Jetzt wird Ihr Code fast so prägnant wie in Python:

\n\n
package main\n\nimport (\n    "fmt"\n    "slices"\n)\n\nfunc main() {\n    languages := []string{"Python", "Java", "Go", "Rust"}\n    if slices.Contains(languages, "Go") {\n        fmt.Println("Go gefunden! (via slices.Contains)")\n    }\n}\n
\n\n

Wichtig: slices.Contains ist eine generische Funktion. Sie funktioniert mit jedem Typ, der den Operator == unterstützt (Strings, Zahlen, boolesche Werte, Strukturen ohne Slices/Maps im Inneren).

\n\n

Methode 2: Suche in einer Map – der König der Performance

\n\n

In Python verwenden Sie in für Wörterbücher, und das ist konstante Zeit O(1). In Go ist es dasselbe, aber die Syntax ist anders:

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    // Erstellen einer Map als Set\n    fruits := map[string]bool{\n        "apple":  true,\n        "banana": true,\n        "cherry": true,\n    }\n\n    if fruits["banana"] {\n        fmt.Println("banana ist vorhanden!")\n    }\n\n    // Der korrektere Weg – mit ok-Prüfung\n    if _, ok := fruits["orange"]; ok                

Blogs

Buchempfehlungen