10

Есть ли в Go тернарный оператор?

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507

5 Answers5

13

В go нет тернарного оператора. Вместо него нужно использовать условный оператор. То есть вместо

result = check ? true : false;

нужно писать

if check {
    result = true
} else {
    result = false
}
stanislav
  • 34,518
  • 27
  • 98
  • 214
3

Как вариант сократить так

result = false
if check {
    result = true
}
  • 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
1

В 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 должен быть последним оператором в текущем случае.

hedgehogues
  • 9,569
1

Надысь я написал для себя несколько утилит, которыми активно пользуюсь в своих проектах. Вдохновил меня язык 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, и глаз легко бьёт программу на части и не нужно вчитываться, чтобы понять, что в функции происходит. В отличие от.

Pak Uula
  • 15,323
0

Если вдруг вам нужен именно оператор, а не управляющая конструкция, можно написать короткую фунцию:

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

Eldar
  • 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
  • Ох, спасибо, что заметили. Там надо добавить .(string) – Eldar Jan 25 '24 at 14:48
  • В крайнем случае, можно явно указать тип вместо interface{} – Eldar Jan 25 '24 at 16:06