Czy mogę napisać prostą instrukcję if-else z przypisaniem zmiennej w go (golang), tak jak zrobiłbym to w php? Na przykład:
$var = ( $a > $b )? $a: $b;
Obecnie muszę korzystać z:
var c int
if a > b {
c = a
} else {
c = b
}
Przepraszamy, nie pamiętam nazwy, jeśli to oświadczenie kontrolne i nie mogłem znaleźć informacji w witrynie lub w wyszukiwarce Google. : /
Odpowiedzi:
Jak wspomniano w komentarzach, Go nie obsługuje trójskładnikowych wkładek. Najkrótsza forma, jaką przychodzi mi do głowy, to:
Ale proszę, nie rób tego, to nie jest tego warte i tylko zmyli ludzi, którzy przeczytają Twój kod.
źródło
Często używam następujących:
w zasadzie to samo, co @ Not_a_Golfer, ale przy użyciu wnioskowania o typie .
źródło
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
sama prędkość jak trójskładnik dla produkcji i imho całkiem niezła czytelność.Jak wspomnieli inni,
Go
nie obsługuje trójskładnikowych jednowarstwowych. Jednak napisałem funkcję narzędzia, która może pomóc ci osiągnąć to, czego chcesz.Oto kilka przypadków testowych, które pokazują, jak możesz z niego korzystać
Dla zabawy napisałem bardziej przydatne funkcje narzędziowe, takie jak:
Jeśli chciałbyś użyć któregokolwiek z nich, możesz je znaleźć tutaj https://github.com/shomali11/util
źródło
Dzięki za wskazanie poprawnej odpowiedzi.
Właśnie sprawdziłem Golang FAQ (duh) i wyraźnie stwierdza, że nie jest to dostępne w języku:
znaleziono dodatkowe informacje, które mogą być interesujące na ten temat:
źródło
var c int; if a > b { c = a } else { c = b }
:? Ale sugerowałbym trzymanie go w 5 liniach, aby stworzyć lekki blok dla rekreacji czytelnika;)Jednym z możliwych sposobów, aby to zrobić tylko w jednym wierszu za pomocą mapy, proste sprawdzanie, czy jestem
a > b
, czy totrue
ja jestem przypisaniec
doa
inaczejb
Wygląda to jednak niesamowicie, ale w niektórych przypadkach może NIE być idealnym rozwiązaniem ze względu na kolejność oceny. Na przykład, jeśli sprawdzam, czy obiekt nie
nil
uzyskuje z niego jakiejś właściwości, spójrz na następujący fragment kodu, który będziepanic
w przypadkumyObj equals nil
Ponieważ mapa zostanie utworzona i zbudowana jako pierwsza przed oceną stanu, więc w takim przypadku
myObj = nil
po prostu wpadnie w panikę.Nie zapomnij wspomnieć, że nadal możesz wykonać warunki w jednej prostej linii, sprawdź następujące elementy:
źródło
Użyj funkcji lambda zamiast operatora trójargumentowego
Przykład 1
aby podać max int
Przykład 2
Załóżmy, że masz tę
must(err error)
funkcję do obsługi błędów i chcesz jej użyć, gdy warunek nie jest spełniony. (ciesz się na https://play.golang.com/p/COXyo0qIslP )źródło
Czasami próbuję użyć funkcji anonimowej, aby definiowanie i przypisywanie odbywało się w tej samej linii. jak poniżej:
https://play.golang.org/p/rMjqytMYeQ0
źródło
Bardzo podobna konstrukcja jest dostępna w języku
*
to znaczy
źródło
Możesz użyć do tego zamknięcia:
Jedyne zastrzeżenie, jakie mam ze składnią zamknięcia w Go, to brak aliasu dla domyślnej funkcji zwracającej zero parametru zero, wtedy byłoby o wiele ładniej (pomyśl jak deklarujesz literały mapy, tablicy i wycinka z samą nazwą typu).
Albo nawet krótsza wersja, jak właśnie zasugerował komentator:
Nadal będziesz musiał użyć domknięcia, jeśli chcesz podać parametry funkcji. Można by tego uniknąć w przypadku przekazywania metod, a nie tylko funkcji, jak myślę, gdzie parametry są strukturą związaną z metodami.
źródło
doif(condition, dothis, dothat)