Перейти к основному содержимому
Модуль 1 · Урок 4 из 54/50 в курсе~8 min
Уроки модуля (4/5)

Операторы

В Go есть классические операторы, которых вы ожидаете, но с несколькими сюрпризами: арифметика, сравнение, логическая, поразрядная. Нет тернарного оператора (a ? b : c), без перегрузки, без неявных преобразований между типами. Простота – это особенность.

Арифметика

Go
a, b := 10, 3
fmt.Println(a + b)  // 13
fmt.Println(a - b)  // 7
fmt.Println(a * b)  // 30
fmt.Println(a / b)  // 3   ← divisione INTERA tra interi
fmt.Println(a % b)  // 1   ← resto (modulo)

Приращение и уменьшение — это ЗАЯВЛЕНИЯ, а не выражения.

x++ и x-- не создают значения: это «действия» и ничего больше. Нет y := x++, как в C.

Go
x := 5
x++          // ok: incrementa x
// y := x++  // ERRORE di compilazione
fmt.Println(x) // 6

Сравнение

== != < <= > >= возвращает bool. Они применимы к числам и строкам; для structs ВСЕ поля должны быть сопоставимы (никаких срезов/карт внутри).

Go
"abc" == "abc"  // true
"abc" < "abd"   // true (ordine lessicografico)
3 != 4           // true

Логический с коротким замыканием

&&, ||, !. Они замыкают слева направо: если первый операнда достаточно для определения результата, второго даже нет оценено.

Go
adult := age >= 18
seniorAdult := age >= 18 && age < 65

Побитовый

& И, | ИЛИ, ^ XOR, << сдвиг влево, >> сдвиг вправо, &^ И НЕ (немного ясно). Они полезны для флагов, двоичного анализа и оптимизации:

Go
flags := uint8(0b0000_0011)
flags |= 0b0000_0100   // imposta un bit:    0000_0111
flags &^= 0b0000_0010  // cancella un bit:   0000_0101
hasFlag := flags & 0b0000_0100 != 0  // true

Никаких неявных преобразований

1 + 1.5 в Go компилируется, поскольку оба являются нетипизированными литералами. Но var i int = 1; i + 1.5 НЕ: вам нужен float64(i) + 1.5.

Go
i := 1
f := 1.5
// i + f          // ERRORE
float64(i) + f    // 2.5

Ваша очередь

Упражнение#go.m1.l4.e1
Попыток: 0Загрузка…

Вычислите остаток от деления 17 на 5 и выведите его. Ожидается: 2.

Загрузка редактора…
Показать подсказку

Оператор по модулю — `%`.

Решение доступно после 3 попыток

Упражнение#go.m1.l4.e2
Попыток: 0Загрузка…

Выведите true, если возраст находится в диапазоне от 18 до 65 лет включительно, в противном случае — false.

Загрузка редактора…
Показать подсказку

Объедините два сравнения с помощью `&&`.

Решение доступно после 3 попыток

Quiz#go.m1.l4.e3
Готово

Что печатает этот код?

Go
a, b := 7, 2
fmt.Println(a/b, a%b)
Варианты ответа

Резюме

  • Классическая арифметика; / между целыми числами — целочисленное деление (усечение).
  • ++ и -- являются утверждениями, а не выражениями: нет y := x++.
  • Операторы сравнения и логические операторы создают bool; &&/|| короткое замыкание. — Побитовый & | ^ << >> &^ для флагов и двоичного анализа. — Никаких неявных преобразований между разными типами: используйте type(x).