Модуль
Урок 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 (больше или равно)Сравнение строк
Строки сравниваются лексикографически (по байтам):
go
"apple" < "banana" // true — 'a' < 'b'
"abc" == "abc" // true
"abc" < "abcd" // true — короче при одинаковом префиксе
"Z" < "a" // true — заглавные буквы меньше строчных в ASCIIЛогические операторы
| Оператор | Название | Описание |
|---|---|---|
&& | AND | true только если оба true |
|| | OR | true если хотя бы один 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Короткое замыкание (short-circuit)
Go не вычисляет правую часть, если результат уже известен по левой:
go
// false && anything → всегда false, правая часть не вызывается
false && heavyComputation() // heavyComputation не вызовется
// true || anything → всегда true, правая часть не вызывается
true || heavyComputation() // heavyComputation не вызоветсяЭто не просто оптимизация — это инструмент защиты от паники:
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 для читаемости
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.
🎯
Миссия 1 из 5
Что вернёт выражение true && false в Go?