Kann ich eine einfache if-else-Anweisung mit variabler Zuweisung in go (golang) schreiben, wie ich es in PHP tun würde? Beispielsweise:
$var = ( $a > $b )? $a: $b;
Derzeit muss ich folgendes verwenden:
var c int
if a > b {
c = a
} else {
c = b
}
Entschuldigung, ich kann mich nicht an den Namen erinnern, wenn diese Steueranweisung und ich die Informationen nicht vor Ort oder über die Google-Suche finden konnten. : /
Antworten:
Wie in den Kommentaren erwähnt, unterstützt Go keine ternären Einzeiler. Die kürzeste Form, die ich mir vorstellen kann, ist folgende:
Aber bitte tun Sie das nicht, es lohnt sich nicht und wird nur Leute verwirren, die Ihren Code lesen.
quelle
Ich benutze oft Folgendes:
Im Grunde das gleiche wie bei @ Not_a_Golfer, jedoch mit Typinferenz .
quelle
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
Gleiche Geschwindigkeit wie ternär für die Produktion und imho ziemlich gute Lesbarkeit.Wie die anderen erwähnt,
Go
unterstützt keine ternären Einzeiler. Ich habe jedoch eine Dienstprogrammfunktion geschrieben, mit der Sie das erreichen können, was Sie möchten.Hier sind einige Testfälle, um zu zeigen, wie Sie es verwenden können
Zum Spaß habe ich weitere nützliche Dienstprogrammfunktionen geschrieben, wie zum Beispiel:
Wenn Sie eines davon verwenden möchten, finden Sie es hier https://github.com/shomali11/util
quelle
Vielen Dank für den Hinweis auf die richtige Antwort.
Ich habe gerade die Golang-FAQ (duh) überprüft und es heißt eindeutig, dass dies nicht in der Sprache verfügbar ist:
Zusätzliche Informationen, die zu diesem Thema von Interesse sein könnten:
quelle
var c int; if a > b { c = a } else { c = b }
? Aber ich würde vorschlagen, es in 5 Zeilen zu halten, um einen Lichtblock für die Erholung des Lesers zu bilden;)Eine Möglichkeit , dies zu tun in nur eine Zeile durch eine Karte verwenden, einfach ich bin Überprüfung , ob ,
a > b
wenn estrue
ich bin Zuweisungc
zua
sonstb
Dies sieht zwar erstaunlich aus, ist jedoch in einigen Fällen aufgrund der Bewertungsreihenfolge möglicherweise NICHT die perfekte Lösung. Wenn ich zum Beispiel überprüfe, ob ein Objekt keine
nil
Eigenschaft daraus erhält, sehen Sie sich das folgende Code-Snippet an, daspanic
im Falle vonmyObj equals nil
Da die Karte zuerst erstellt und erstellt wird, bevor der Zustand bewertet wird, kommt es in diesem Fall
myObj = nil
einfach zu einer Panik.Um nicht zu vergessen zu erwähnen, dass Sie die Bedingungen immer noch in nur einer einfachen Zeile ausführen können, überprüfen Sie Folgendes:
quelle
Verwenden Sie die Lambda-Funktion anstelle des ternären Operators
Beispiel 1
um die max int zu geben
Beispiel 2
Angenommen, Sie haben diese
must(err error)
Funktion zur Behandlung von Fehlern und möchten sie verwenden, wenn eine Bedingung nicht erfüllt ist. (viel Spaß unter https://play.golang.com/p/COXyo0qIslP )quelle
Manchmal versuche ich, eine anonyme Funktion zu verwenden, um das Definieren und Zuweisen in derselben Zeile zu erreichen. Wie unten:
https://play.golang.org/p/rMjqytMYeQ0
quelle
Eine sehr ähnliche Konstruktion ist in der Sprache verfügbar
* *
dh
quelle
Sie können hierfür einen Verschluss verwenden:
Der einzige Kritikpunkt, den ich an der Abschlusssyntax in Go habe, ist, dass es keinen Alias für die Standard-Nullparameter-Rückgabefunktion gibt. Dann wäre es viel schöner (denken Sie daran, wie Sie Map-, Array- und Slice-Literale mit nur einem Typnamen deklarieren).
Oder sogar die kürzere Version, wie ein Kommentator gerade vorgeschlagen hat:
Sie müssten immer noch einen Abschluss verwenden, wenn Sie den Funktionen Parameter zuweisen müssten. Dies könnte vermieden werden, wenn Methoden übergeben werden und nicht nur Funktionen, von denen ich denke, dass die Parameter die mit den Methoden verknüpfte Struktur sind.
quelle
doif(condition, dothis, dothat)