Уроки модуля (4/5)
Операторы
В Go есть классические операторы, которых вы ожидаете, но с несколькими сюрпризами:
арифметика, сравнение, логическая, поразрядная. Нет тернарного оператора
(a ? b : c), без перегрузки, без неявных преобразований между типами.
Простота – это особенность.
Арифметика
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.
x := 5
x++ // ok: incrementa x
// y := x++ // ERRORE di compilazione
fmt.Println(x) // 6Сравнение
== != < <= > >= возвращает bool. Они применимы к числам и строкам; для
structs ВСЕ поля должны быть сопоставимы (никаких срезов/карт внутри).
"abc" == "abc" // true
"abc" < "abd" // true (ordine lessicografico)
3 != 4 // trueЛогический с коротким замыканием
&&, ||, !. Они замыкают слева направо: если первый
операнда достаточно для определения результата, второго даже нет
оценено.
adult := age >= 18
seniorAdult := age >= 18 && age < 65Побитовый
& И, | ИЛИ, ^ XOR, << сдвиг влево, >> сдвиг вправо, &^ И
НЕ (немного ясно). Они полезны для флагов, двоичного анализа и
оптимизации:
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.
i := 1
f := 1.5
// i + f // ERRORE
float64(i) + f // 2.5Ваша очередь
Вычислите остаток от деления 17 на 5 и выведите его. Ожидается: 2.
Показать подсказку
Оператор по модулю — `%`.
Решение доступно после 3 попыток
Выведите true, если возраст находится в диапазоне от 18 до 65 лет включительно, в противном случае — false.
Показать подсказку
Объедините два сравнения с помощью `&&`.
Решение доступно после 3 попыток
Что печатает этот код?
a, b := 7, 2
fmt.Println(a/b, a%b)Резюме
- Классическая арифметика;
/между целыми числами — целочисленное деление (усечение). ++и--являются утверждениями, а не выражениями: нетy := x++.- Операторы сравнения и логические операторы создают
bool;&&/||короткое замыкание. — Побитовый& | ^ << >> &^для флагов и двоичного анализа. — Никаких неявных преобразований между разными типами: используйтеtype(x).