Могу ли я написать простой оператор if-else с присвоением переменных в go (golang), как если бы я делал это в php? Например:
$var = ( $a > $b )? $a: $b;
В настоящее время мне нужно использовать следующее:
var c int
if a > b {
c = a
} else {
c = b
}
Извините, я не могу вспомнить имя, если это управляющее утверждение, и мне не удалось найти информацию на сайте или через поиск Google. : /
Ответы:
Как уже упоминалось в комментариях, Go не поддерживает тройные однострочники. Самая короткая форма, которую я могу придумать, такова:
Но, пожалуйста, не делайте этого, это того не стоит и только запутает людей, читающих ваш код.
источник
Я часто использую следующее:
в основном то же самое, что и @ Not_a_Golfer, но с использованием вывода типа .
источник
listeningPath := "production.some.com"; if DEBUG { listeningPath := "development.some.com" }
та же скорость, что и у троичного для продакшена, и, имхо, довольно хорошая читаемость.Как уже упоминалось,
Go
не поддерживает тройные однострочные. Однако я написал служебную функцию, которая может помочь вам достичь желаемого.Вот несколько тестовых примеров, чтобы показать, как вы можете его использовать
Ради интереса я написал более полезные служебные функции, такие как:
Если вы хотите использовать любой из них, вы можете найти их здесь https://github.com/shomali11/util
источник
Спасибо, что указали на правильный ответ.
Я только что проверил FAQ Golang (да), и там ясно сказано, что это недоступно на языке:
обнаружена дополнительная информация, которая может быть интересна по теме:
источник
var c int; if a > b { c = a } else { c = b }
:? Но я бы посоветовал оставить его в 5 строк, чтобы сформировать световой блок для отдыха читателя;)Один из возможных способов сделать это только в одной строке, используя карту, просто я проверяю ли
a > b
еслиtrue
я назначаюc
вa
противном случаеb
Однако это выглядит потрясающе, но в некоторых случаях это может быть НЕ идеальное решение из-за порядка оценки. Например, если я проверяю, не
nil
получает ли объект какое-либо свойство из него, посмотрите следующий фрагмент кода, которыйpanic
в случаеmyObj equals nil
Поскольку карта будет создана и построена сначала до оценки состояния, поэтому в случае
myObj = nil
этого просто произойдет паника.Не забудьте упомянуть, что вы все еще можете выполнять условия в одной простой строке, проверьте следующее:
источник
Используйте лямбда-функцию вместо тернарного оператора
Пример 1
чтобы дать максимальное int
Пример 2
Предположим, у вас есть эта
must(err error)
функция для обработки ошибок и вы хотите использовать ее, когда условие не выполняется. (наслаждайтесь на https://play.golang.com/p/COXyo0qIslP )источник
Очень похожая конструкция доступна на языке
*
т.е.
источник
Иногда я пытаюсь использовать анонимную функцию, чтобы определение и назначение происходили в одной строке. как показано ниже:
https://play.golang.org/p/rMjqytMYeQ0
источник
Для этого можно использовать закрытие:
Единственная проблема, с которой я столкнулся с синтаксисом закрытия в Go, - это отсутствие псевдонима для функции возврата с нулевым параметром по умолчанию, тогда это было бы намного лучше (подумайте, как вы объявляете литералы map, array и slice только с именем типа).
Или даже более короткая версия, как только что предложил комментатор:
Вам все равно придется использовать замыкание, если вам нужно передать параметры функциям. Этого можно было бы избежать в случае передачи методов, а не просто функций, я думаю, где параметры - это структура, связанная с методами.
источник
doif(condition, dothis, dothat)