🐹 Go

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 нельзя сравнить число и строку напрямую. Например,