Einleitung: Ternärer Operator – Freund oder Feind?
\n\nWenn Sie aus der Welt von C, C++, Java oder JavaScript zu Go kommen, sind Sie wahrscheinlich an die prägnante Konstruktion gewöhnt:
\n\nint max = (a > b) ? a : b;\n\nDas 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 ? :.
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\nIn 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-elseersetzt. \n - Fortgeschrittene Techniken: Funktionen, Map, Inlining. \n
- Wann man die Regel brechen kann (und sollte). \n
Los geht's!
\n\nWarum hat Go auf den ternären Operator verzichtet?
\n\nDie Antwort ist einfach und liegt in der Philosophie der Sprache: Lesbarkeit ist wichtiger als Kürze.
\n\nRobert 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\nint x = (a ? b : c) ? d : e;\n\nVersuchen 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\nIn 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\nBasisersatz: if-else als Idiom
\n\nDer 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.
Beispiel: Das Maximum zweier Zahlen finden.
\n\nIn C:
\nint max = (a > b) ? a : b;\n\nIn Go (idiomatisch):
\nvar 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\nDarü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\nFortgeschrittene Techniken: Wenn man Kürze wünscht
\n\nManchmal 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.
1. Hilfsfunktion
\n\nWenn 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\nfunc 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\nWichtig: 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?
2. Verwendung einer Map zur Auswahl
\n\nWenn 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\nvar result = map[bo