Go में तुलना ऑपरेटर और लॉजिकल ऑपरेटर
Что это и зачем?
Представь, что ты играешь в компьютерную игру. Чтобы пройти уровень, тебе нужно проверить: "Хватит ли у меня жизней?" или "Собрал ли я все ключи?". В программировании такие проверки делают операторы сравнения и логические операторы.
Операторы сравнения — это как весы. Они сравнивают два числа или значения и говорят: "Да, это правда" или "Нет, это ложь". Например: "5 больше 3?" — да, правда. "2 равно 10?" — нет, ложь.
Логические операторы — это как судья, который объединяет несколько проверок. Например: "У тебя есть ключ И ты знаешь пароль?" — только если оба условия верны, дверь откроется. Или: "Ты нашёл сундук ИЛИ победил дракона?" — если хоть одно условие верно, ты получаешь награду.
Зачем это нужно? Без них программа была бы как робот, который делает одно и то же, не глядя на ситуацию. А с ними она может принимать решения: "Если температура выше 30, включи кондиционер", "Если пользователь ввёл правильный пароль, пусти его в личный кабинет".
В Go (язык программирования от Google) эти операторы выглядят очень просто и понятно. Давай разберёмся!
Синтаксис и примеры кода
В Go есть 6 основных операторов сравнения и 3 логических оператора. Вот они в таблице:
| Оператор | Что значит | Пример | Результат |
|---|---|---|---|
== |
равно | 5 == 5 |
true (правда) |
!= |
не равно | 5 != 3 |
true |
> |
больше | 10 > 7 |
true |
< |
меньше | 3 < 8 |
true |
>= |
больше или равно | 5 >= 5 |
true |
<= |
меньше или равно | 4 <= 9 |
true |
&& |
И (AND) | (5 > 3) && (2 < 4) |
true |
|| |
ИЛИ (OR) | (5 > 10) || (2 < 4) |
true |
! |
НЕ (NOT) | !(5 > 10) |
true |
Теперь посмотрим на живые примеры. Представь, что мы пишем программу для проверки возраста входа в кинотеатр.
package main
import "fmt"
func main() {
// Пример 1: проверка возраста
age := 16
fmt.Println("Возраст:", age)
// Можно ли смотреть фильм с рейтингом 18+?
canWatch := age >= 18
fmt.Println("Может смотреть 18+?", canWatch) // false, потому что 16 меньше 18
// Пример 2: проверка скидки для студентов
isStudent := true
age = 20
// Скидка даётся, если ты студент И твой возраст меньше 25
hasDiscount := isStudent && (age < 25)
fmt.Println("Есть скидка?", hasDiscount) // true, потому что оба условия верны
// Пример 3: проверка на вход в клуб
age = 17
hasParent := true
// В клуб пускают, если тебе 18+ ИЛИ если ты с родителями
canEnter := (age >= 18) || hasParent
fmt.Println("Может войти в клуб?", canEnter) // true, потому что hasParent = true
// Пример 4: проверка, что число не равно нулю
score := 0
isNotZero := score != 0
fmt.Println("Счёт не ноль?", isNotZero) // false, потому что score = 0
// Пример 5: сложное условие с отрицанием
isWeekend := false
isHoliday := true
// Можно не идти в школу, если сегодня выходной ИЛИ праздник
// Но мы хотим проверить обратное: "Нужно ли идти в школу?"
mustGoToSchool := !(isWeekend || isHoliday)
fmt.Println("Нужно идти в школу?", mustGoToSchool) // false, потому что isHoliday = true
}
Обрати внимание: в Go результат сравнения — это всегда true (правда) или false (ложь). Это специальный тип данных bool (назван в честь математика Буля).
Логические операторы работают так:
&&(И) — даёт true, только если оба условия true. Если хоть одно false — результат false.||(ИЛИ) — даёт true, если хотя бы одно условие true. Если оба false — результат false.!(НЕ) — переворачивает значение: true становится false, false становится true.
Вот ещё один пример, который показывает, как это работает в реальной программе:
package main
import "fmt"
func main() {
// Проверка: можно ли купить билет на аттракцион?
height := 140 // рост в сантиметрах
age := 10 // возраст
// Условие: рост от 120 до 190 И возраст от 8 до 16
canRide := (height >= 120) && (height <= 190) && (age >= 8) && (age <= 16)
fmt.Println("Можно кататься?", canRide) // true, все условия выполнены
// А если рост 110?
height = 110
canRide = (height >= 120) && (height <= 190) && (age >= 8) && (age <= 16)
fmt.Println("Можно кататься при росте 110?", canRide) // false, рост слишком мал
}
Сравнение с Python
Если ты уже пробовал Python, ты заметишь, что идея та же, но есть мелкие отличия. Давай сравним:
| Действие | Go | Python |
|---|---|---|
| Равно | == |
== |
| Не равно | != |
!= |
| Больше/меньше | > < |
> < |
| И | && |
and |
| ИЛИ | || |
or |
| НЕ | ! |
not |
Главное отличие — в Go логические операторы пишутся символами (&&, ||, !), а в Python — словами (and, or, not). Это как в математике: в одном учебнике используют знак "×" для умножения, а в другом — точку "·".
Вот как один и тот же код выглядит на двух языках:
// Go
age := 15
hasTicket := true
canEnter := (age >= 12) && hasTicket
fmt.Println(canEnter) // true
# Python
age = 15
has_ticket = True
can_enter = (age >= 12) and has_ticket
print(can_enter) # True
Ещё одно отличие: в Go нельзя написать 5 < age < 10 как в Python. В Go нужно писать (age > 5) && (age < 10). Это немного длиннее, зато сразу видно, что проверяются два условия.
Типичные ошибки новичков
Вот что чаще всего путают начинающие программисты на Go:
1. Путают = и ==
Одна из самых частых ошибок! = — это присваивание (положить значение в переменную), а == — это сравнение (проверить, равны ли значения).
// Ошибка!
if age = 18 { // Здесь нужно ==, а не =
fmt.Println("Тебе 18")
}
// Правильно:
if age == 18 {
fmt.Println("Тебе 18")
}
2. Забывают про скобки в сложных условиях
Когда используешь несколько логических операторов, ставь скобки, чтобы было понятно, что с чем сравнивается.
// Плохо (непонятно, что имел в виду программист):
if age > 10 && age < 20 || hasTicket {
// ...
}
// Хорошо (сразу видно логику):
if (age > 10 && age < 20) || hasTicket {
// ...
}
3. Сравнивают разные типы
В Go нельзя сравнить число и строку напрямую. Например,