HOWTO · Go
Das idiomatische Go-Äquivalent des ternären Operators von C
Dieses Tutorial untersucht das idiomatische Go-Äquivalent des ternären Operators von C mithilfe von if-else-Anweisungen. Erfahren Sie, wie Sie bedingte Logik in Go mit klaren Beispielen und Erklärungen implementieren. Entdecken Sie die Vorteile von Gos Designphilosophie, die Lesbarkeit und Wartbarkeit betont und Ihren Code leichter verständlich macht.
Auf dieser Seite
Go hat keinen ternären Operator. Um einen Wert anhand einer Bedingung auszuwählen, verwenden Sie eine if/else-Anweisung und weisen das Ergebnis in jedem Zweig zu. Dadurch bleibt die Entscheidung als Kontrollfluss sichtbar und funktioniert überall dort, wo eine Anweisung erlaubt ist.
Was der ternäre Operator von C macht
Der bedingte Operator von C verwendet die Form condition ? true_expression : false_expression. Er hat drei Operanden: eine Bedingung und zwei Ausdrücke, die das Ergebnis liefern. C wertet die Bedingung aus und wertet dann den Ausdruck nach ? aus, wenn sie wahr ist, oder den Ausdruck nach :, wenn sie falsch ist. Zum Beispiel weist int b = (a > 3) ? 10 : 20; der Variablen b den Wert 10 zu, wenn a größer als 3 ist, und andernfalls 20.
Diese Form ist ein Ausdruck, daher kann sie innerhalb eines größeren Ausdrucks oder auf der rechten Seite einer Zuweisung stehen. Go hat bewusst keinen entsprechenden Inline-Bedingungsausdruck. Seine if-Anweisung ist eine Anweisung, daher platziert eine Go-Übersetzung die Zuweisungen in den Zweigen, anstatt zu versuchen, if dort einzusetzen, wo C einen Ausdruck erwartet.
if-else in Go verwenden
Das folgende vollständige Programm übersetzt die C-Zuweisung und zeigt außerdem, wie man aus einer booleschen Bedingung 1 oder 0 zuweist. Die Kurzdeklaration a := 5 erstellt und initialisiert a; var b int deklariert b, bevor einer der beiden Zweige ihr einen Wert zuweist. Der else-Zweig muss an die schließende Klammer des if-Zweigs angehängt werden. Ändern Sie a, um zu sehen, welchen Wert jede Entscheidung zuweist.
package main
import "fmt"
func main() {
a := 5
var b int
if a > 3 {
b = 10
} else {
b = 20
}
var isLarge int
if a > 3 {
isLarge = 1
} else {
isLarge = 0
}
fmt.Println(b)
fmt.Println(isLarge)
}
10
1
Die erste Entscheidung wählt zwischen 10 und 20 und entspricht damit der C-Zuweisung. Die zweite wandelt die Bedingung in ein ganzzahliges Flag um. Dies sind gewöhnliche Zuweisungen in jedem Zweig. Die Ausgabe oben zeigt die vom Programm ausgegebenen Werte.
Ein if kann auch eine Initialisierungsanweisung enthalten, wie zum Beispiel if n := len(items); n > 0 { ... }. Die dort deklarierte Variable ist auf die if-Anweisung und ihre else-Zweige beschränkt. Verwenden Sie diese Form, wenn der Wert nur für diese Entscheidung benötigt wird; andernfalls deklarieren Sie ihn vor der Anweisung, damit späterer Code ihn verwenden kann.
Mehrere Bedingungen in Go behandeln
Wenn eine Entscheidung mehr als zwei Ergebnisse hat, macht eine if/else if-Kette die Reihenfolge explizit. Go prüft die Bedingungen von oben nach unten und führt den ersten übereinstimmenden Zweig aus; das abschließende else behandelt alle übrigen Werte. Bringen Sie die nützlichsten Unterscheidungen in eine klare Reihenfolge, insbesondere wenn eine Bedingung Werte einschließt, die auch von einer anderen erfasst werden.
Für mehrere sich gegenseitig ausschließende Werte eines Ausdrucks kann ein switch leichter zu überblicken sein als eine lange Kette. Ein herkömmliches Switch vergleicht einen Wert mit seinen case-Werten. Go erlaubt auch ein ausdrucksloses switch, bei dem jeder case eine boolesche Bedingung enthält, ähnlich einer if/else if-Kette. Zum Beispiel drückt switch { case score >= 90: grade = "A"; case score >= 80: grade = "B"; default: grade = "C" } geordnete Bereiche aus. Schreiben Sie in formatiertem Go-Quellcode jeden Case-Rumpf der Lesbarkeit halber auf eigene Zeilen.
Weder ein Switch noch eine If-Kette ist ein ternärer Ausdruck: Beides sind Anweisungen, die steuern, welche Anweisungen ausgeführt werden. Wählen Sie if/else für eine kleine Entscheidung oder geordnete Bedingungen und wählen Sie switch, wenn die Gruppierung mehrerer Fälle die Auswahl leichter verständlich macht. Ein Switch ist eine Option, kein universell besserer Ersatz; die Form der Entscheidung sollte die Wahl leiten.
FAQ
Was ist der ternäre Operator in C?
Es ist der bedingte Operator von C, geschrieben als condition ? true_expression : false_expression. Die Bedingung wählt einen der beiden Ergebnisausdrücke aus.
Hat Go einen ternären Operator?
Nein. Go verwendet if/else-Anweisungen für bedingte Logik. Sie können eine if-Anweisung nicht als Inline-Ausdruck in einer Zuweisung oder einem Funktionsargument verwenden.
Kann ich verschachtelte if-else-Anweisungen in Go verwenden?
Ja. Für mehrere Ergebnisse ist eine else if-Kette oft leichter nachzuvollziehen, als jedes if in einem anderen zu verschachteln. Beide Formen sind Anweisungen, und jeder Zweig kann einen Wert zuweisen oder andere Arbeit ausführen.
Wann sollte ich stattdessen switch verwenden?
Verwenden Sie switch, wenn die Fälle eine klare Menge von Alternativen bilden oder wenn ein ausdrucksloses Switch mehrere zusammenhängende Bedingungen leichter lesbar macht. Verwenden Sie eine if/else if-Kette, wenn die geordneten Vergleiche die Entscheidung direkter vermitteln.
Die praktische Übersetzung besteht darin, die Bedingung und ihre Alternativen explizit zu halten: Verwenden Sie Cs ?: beim Lesen von C-Code und verwenden Sie Gos if/else- oder switch-Anweisungen für den entsprechenden Go-Kontrollfluss.