Der ternäre Operator in Go: Wie man C ersetzt und nicht verrückt wird

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: Ternärer Operator – Freund oder Feind?

\n\n

Wenn Sie aus der Welt von C, C++, Java oder JavaScript zu Go kommen, sind Sie wahrscheinlich an die prägnante Konstruktion gewöhnt:

\n\n
int max = (a > b) ? a : b;
\n\n

Das ist der ternäre Operator. Er ist kompakt, elegant und erlaubt es, eine einfache Verzweigung in eine Zeile zu schreiben. Aber wenn Sie anfangen, in Go zu schreiben, erwartet Sie eine Überraschung: Go hat keinen ternären Operator. Gar keinen. Kein ? :.

\n\n

Warum haben die Sprachschöpfer diesen Schritt gewagt? Wie schreibt man jetzt kurze bedingte Zuweisungen? Und vor allem – wie macht man das idiomatisch, also im Stil, der in der Go-Community üblich ist?

\n\n

In diesem Artikel behandeln wir:

\n
    \n
  • Warum es in Go keinen ternären Operator gibt (Spoiler: Es ist eine bewusste Entscheidung).
  • \n
  • Wie man den ternären Operator mit if-else ersetzt.
  • \n
  • Fortgeschrittene Techniken: Funktionen, Map, Inlining.
  • \n
  • Wann man die Regel brechen kann (und sollte).
  • \n
\n\n

Los geht's!

\n\n

Warum hat Go auf den ternären Operator verzichtet?

\n\n

Die Antwort ist einfach und liegt in der Philosophie der Sprache: Lesbarkeit ist wichtiger als Kürze.

\n\n

Robert Griesemer (einer der Schöpfer von Go) sagte einmal: „Der ternäre Operator ist eine Quelle von Fehlern. Er wird zu leicht falsch gelesen, besonders wenn er verschachtelt ist.“ Und das stimmt. Denken Sie nur an das berühmte Beispiel aus C:

\n\n
int x = (a ? b : c) ? d : e;
\n\n

Versuchen Sie auf Anhieb zu verstehen, was das tut? Nun, die Go-Entwickler entschieden, dass es besser ist, auf eine Zeile zu verzichten, aber den Code offensichtlich zu machen.

\n\n

In Go hat Klarheit der Absicht Priorität. Wenn Sie eine Bedingung schreiben, soll sie explizit sein. Der ternäre Operator wird oft zu einer „magischen Zahl“: Sie sehen die Zeile an und verstehen die Logik nicht sofort. In Go sollte das nicht vorkommen.

\n\n

Basisersatz: if-else als Idiom

\n\n

Der einfachste und korrekteste Weg, den ternären Operator zu ersetzen, ist die Verwendung eines normalen if-else. Ja, es braucht 3 Zeilen statt 1, aber es liest sich ohne Anstrengung.

\n\n

Beispiel: Das Maximum zweier Zahlen finden.

\n\n

In C:

\n
int max = (a > b) ? a : b;
\n\n

In Go (idiomatisch):

\n
var max int\nif a > b {\n    max = a\n} else {\n    max = b\n}
\n\n

„Aber das ist länger!“, werden Sie sagen. Ja. Aber betrachten Sie es von der anderen Seite: In einem Monat werden Sie den Code öffnen und die Logik sofort sehen. Keine Klammern, keine Mehrdeutigkeiten. Einfach „wenn a größer als b ist, dann max = a, sonst max = b“.

\n\n

Darüber hinaus betrachtet die Go-Community diesen Stil als einzig richtig für einfache Bedingungen. Versuchen Sie nicht zu „schummeln“ und alles in eine Zeile zu packen – das wird als schlechter Stil angesehen.

\n\n

Fortgeschrittene Techniken: Wenn man Kürze wünscht

\n\n

Manchmal schreibt man Code, bei dem if-else 10 Zeilen einnimmt, obwohl es im Kern eine einfache Zuweisung ist. In solchen Fällen kann man einige Muster anwenden, die die Idiomatik bewahren, aber den Code kompakter machen.

\n\n

1. Hilfsfunktion

\n\n

Wenn Sie oft zwischen zwei Werten wählen müssen, lagern Sie die Logik in eine Funktion aus. Das ist besonders praktisch für einzeilige Operationen.

\n\n
func ternary(cond bool, a, b string) string {\n    if cond {\n        return a\n    }\n    return b\n}\n\n// Verwendung:\ngreeting := ternary(isMorning, "Guten Morgen", "Guten Abend")
\n\n

Wichtig: Nennen Sie die Funktion nicht ternary – das gilt als schlechter Stil, da Sie versuchen, den ternären Operator durch die Hintertür einzuschleusen. Geben Sie besser einen aussagekräftigen Namen, z. B. ifElse oder choose. Aber wenn Sie für sich selbst schreiben – warum nicht?

\n\n

2. Verwendung einer Map zur Auswahl

\n\n

Wenn die Bedingung auf eine Auswahl zwischen zwei Optionen hinausläuft, können Sie eine Map mit booleschen Schlüsseln verwenden. Das sieht ungewöhnlich aus, lässt sich aber manchmal sogar besser lesen.

\n\n
var result = map[bo                

Blogs

Buchempfehlungen