Есть ли в Go тернарный оператор?
5 Answers
В go нет тернарного оператора. Вместо него нужно использовать условный оператор. То есть вместо
result = check ? true : false;
нужно писать
if check {
result = true
} else {
result = false
}
- 34,518
- 27
- 98
- 214
Как вариант сократить так
result = false
if check {
result = true
}
- 31
-
2Чем ваш вариант ответа отличается от ответа товарища @stanislav? – Dmitrii Jun 27 '20 at 12:43
-
Ничем, просто вариант записи, если любите сокращать код и стремитесь к уменьшению строк, result изначально будет проинициализирован как false, и в гоу не надо назначать явно var result bool // result уже false – Mark Irkzher Jun 28 '20 at 18:34
-
Допустим, тогда зачем вы явно инициализируете в своем ответе?) Ваш пример ни чем не отличается от другого ответа, и количество кода одинаковое, разве что нет лишней конструкции, но это на "наведение марафета" не тянет, неа. – Dmitrii Jun 28 '20 at 19:02
-
ну как же, красивее и всего 4 строки, да можно заменить на инициализацию – Mark Irkzher Jun 29 '20 at 20:05
В Go нет тернарного оператора. Вместо этого, вы можете использовать условную конструкцию if, чтобы выполнить различные действия в зависимости от условия. Например:
x := 10
y := 5
var max int
if x > y {
max = x
} else {
max = y
}
В этом примере переменная max будет равна 10, так как условие x > y истинно.
Также вы можете использовать укороченную форму условной конструкции if, чтобы не создавать отдельную переменную:
x := 10
y := 5
if max := x; x > y {
// max доступна только внутри этой ветки
fmt.Println(max) // 10
} else {
// max доступна только внутри этой ветки
fmt.Println(max) // 5
}
В Go есть также тип данных switch, который может быть использован для выполнения различных действий в зависимости от значения переменной.
Синтаксис условной конструкции switch выглядит следующим образом:
switch variable {
case value1:
// действия, выполняемые при variable == value1
case value2:
// действия, выполняемые при variable == value2
...
default:
// действия, выполняемые при любом другом значении variable
}
Например:
x := 10
switch x {
case 5:
fmt.Println("x равно 5")
case 10:
fmt.Println("x равно 10")
default:
fmt.Println("x не равно 5 или 10")
}
В этом примере будет выведено "x равно 10", так как значение переменной x равно 10.
В конструкции switch вы можете указать несколько значений для одного случая, разделив их запятыми:
x := 10
switch x {
case 5, 10:
fmt.Println("x равно 5 или 10")
default:
fmt.Println("x не равно 5 или 10")
}
В конструкции switch вы можете использовать условия в случаях, чтобы управлять выполнением кода в зависимости от более сложных условий. Например:
x := 10
y := 5
switch {
case x > y:
fmt.Println("x больше y")
case x < y:
fmt.Println("x меньше y")
default:
fmt.Println("x равно y")
}
С помощью конструкции switch вы также можете использовать оператор fallthrough, чтобы выполнить код из следующего случая, даже если условие в текущем случае истинно. Например:
x := 10
switch x {
case 5:
fmt.Println("x равно 5")
case 10:
fmt.Println("x равно 10")
fallthrough
case 15:
fmt.Println("x равно 15")
default:
fmt.Println("x не равно 5, 10 или 15")
}
В этом примере будут выведены следующие строки:
x равно 10
x равно 15
Оператор fallthrough позволяет выполнять код из следующего случая, независимо от того, истинно ли условие в текущем случае. Обычно он используется, когда условие в текущем случае проверяет несколько значений, а условие в следующем случае проверяет одно из этих значений. Например:
x := 10
switch x {
case 5, 10:
fmt.Println("x равно 5 или 10")
fallthrough
case 15:
fmt.Println("x равно 15")
default:
fmt.Println("x не равно 5, 10 или 15")
}
В этом примере будут выведены следующие строки:
x равно 5 или 10
x равно 15
Обратите внимание, что оператор fallthrough должен быть последним оператором в текущем случае.
- 9,569
Надысь я написал для себя несколько утилит, которыми активно пользуюсь в своих проектах. Вдохновил меня язык Rust, поэтому модуль назван go-rusty. Помимо всего прочего там есть и реализация тернарного оператора как дженерик-функции
func If[T any](cond bool, Then T, Else T) T {
if (cond) { return Then } else { return Else }
}
Использую для присваиваний в одну строку
prefix := expr.If(direction > 0, "buy", "sell")
вместо
var prefix string
if (direction > 0) {
prefix = "buy"
} else {
prefix = "sell"
}
Но знаете, что я вам скажу? Тернарный оператор, неявный проброс исключений вместо явной проверки if err != nil { ... } и прочие компактификаторы кода здорово сокращают количество нажатий на клавиши. Но текст становится плотнее, и, лично для меня, значительно сложнее для чтения.
Есть своя правда во всех этих бесконечных if. В программах на нормальном Го, без вот этих вот тернарных операторов и прочих ухищрений, строчки короткие, много пустоты благодаря if, и глаз легко бьёт программу на части и не нужно вчитываться, чтобы понять, что в функции происходит. В отличие от.
- 15,323
Если вдруг вам нужен именно оператор, а не управляющая конструкция, можно написать короткую фунцию:
func TerOp(condition bool, first, second interface{}) interface{} {
if condition {
return first
}
return second
}
// 1 попугай 2 попугая 38 попугаев
parrots := "попуга" + TerOp(qty<5, TerOp(qty<2, "й", "я"), "ев").(string)
Изменено после комментария Pak Uula
- 1
-
Ваш пример не компилируется - к строке нельзя прибавить
interface{}. Нужно использовать дженерик:func TerOp[T any](condition bool, first, second T) T { if condition { return first } else { return second } }– Pak Uula Jan 24 '24 at 13:21 -
-