Модуль
1Hello, World!2Переменные в Go3Целые числа4Строки и руны5float64 и числа с плавающей точкой6if, switch, for7bool и логические операторы← вы здесь8Константы и iota9Пакет fmt: форматирование вывода
Урок 7~15 минут

bool и логические операторы

Тип bool

В Go тип bool принимает ровно два значения: true и false. Нулевое значение — false.

go
var a bool        // false (нулевое значение)
b := true
c := false
 
fmt.Println(a, b, c)  // false true false
fmt.Printf("%T\n", b) // bool

Важно: в Go нет неявных преобразований в bool. То, что работает в C или Python, здесь не работает:

go
n := 1
 
// ❌ ОШИБКА КОМПИЛЯЦИИ — Go не конвертирует int в bool:
if n { }
 
// ✅ Правильно — явная проверка:
if n != 0 { }
if n > 0 { }

Это кажется строгим, но спасает от багов типа if x = 5 (присваивание вместо сравнения).


Операторы сравнения

Результат любого сравнения — bool:

go
a, b := 10, 20
 
fmt.Println(a == b)   // false  (равно)
fmt.Println(a != b)   // true   (не равно)
fmt.Println(a < b)    // true   (меньше)
fmt.Println(a > b)    // false  (больше)
fmt.Println(a <= b)   // true   (меньше или равно)
fmt.Println(a >= b)   // false  (больше или равно)
Операторы сравнения
Ctrl+Enter
1

Сравнение строк

Строки сравниваются лексикографически (по байтам):

go
"apple" < "banana"   // true  — 'a' < 'b'
"abc" == "abc"       // true
"abc" < "abcd"       // true  — короче при одинаковом префиксе
"Z" < "a"            // true  — заглавные буквы меньше строчных в ASCII

Логические операторы

ОператорНазваниеОписание
&&ANDtrue только если оба true
||ORtrue если хотя бы один true
!NOTинвертирует значение
go
t, f := true, false
 
fmt.Println(t && t)  // true
fmt.Println(t && f)  // false
fmt.Println(f && f)  // false
 
fmt.Println(t || f)  // true
fmt.Println(f || f)  // false
 
fmt.Println(!t)      // false
fmt.Println(!f)      // true
Таблица истинности
Ctrl+Enter
1

Короткое замыкание (short-circuit)

Go не вычисляет правую часть, если результат уже известен по левой:

go
// false && anything → всегда false, правая часть не вызывается
false && heavyComputation()  // heavyComputation не вызовется
 
// true || anything → всегда true, правая часть не вызывается
true || heavyComputation()   // heavyComputation не вызовется
Short-circuit evaluation
Ctrl+Enter
1

Это не просто оптимизация — это инструмент защиты от паники:

go
// Безопасная проверка: если slice пуст, второй операнд не выполнится
if len(items) > 0 && items[0] == target {
    fmt.Println("нашли!")
}
 
// Проверка указателя перед разыменованием
if ptr != nil && ptr.Value > 0 {
    fmt.Println(ptr.Value)
}

Паттерны с bool

Флаги

go
found := false
for _, v := range data {
    if v == target {
        found = true
        break
    }
}
if found {
    fmt.Println("нашли!")
}

Функции возвращающие bool

go
func isEven(n int) bool { return n%2 == 0 }
func isPrime(n int) bool {
    if n < 2 { return false }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 { return false }
    }
    return true
}
 
fmt.Println(isEven(4))   // true
fmt.Println(isPrime(17)) // true
Функции с bool
Ctrl+Enter
1

Именованные bool для читаемости

go
// Плохо:
if !user.active || user.role == "admin" && !user.banned {
    // сложно читать
}
 
// Хорошо:
isActive := user.active
isAdmin  := user.role == "admin"
isBanned := user.banned
 
if !isActive || (isAdmin && !isBanned) {
    // понятно
}

В следующем уроке разберём константы и iota — мощный инструмент для перечислений и флагов.

В Go нет числового bool. if 1 {} — это ошибка компиляции. Только true и false. Это предотвращает целый класс багов из C/Python.
Логические выражения Gobool

Измените значения a и b и смотрите результаты операторов сравнения:

a5
b3
a == bfalse
a != btrue
a < bfalse
a > btrue
a <= bfalse
a >= btrue
🎯
Миссия 1 из 5
Что вернёт выражение true && false в Go?