Буль‑bool: true, false и основы условных выражений в Go

Тип bool в Go является встроенным примитивным типом и имеет только 2 значения: true, false.

// В памяти: ~1 байт (может зависеть от реализации компилятора, выравнивания, архитектуры и пр.)
type bool bool

// true и false в Go являются нетипизированными bool константами

Рассмотрим конструкции и операторы, которые работают с типом bool.

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

В Go существуют следующие логические конструкции

println(a && b) // false
println(a || b) // true
println(!a)     // false - ! является унарным оператором

Важно отметить, что при работе с условной логикой в Go действуют принципы вычисления сокращённого вычисления (short-circuit).

Это обозначает, что если результат вычисления выражения очевиден после вычисления его части, то дальнейшие вычисления не выполняются.

ОператорУсловия прекращения вычислений
&& (логическое И)Если левый операнд равен false, то правый операнд не вычисляется
|| (логическое ИЛИ)Если левый операнд равен true, то правый операнд не вычисляется

В Go не существует оператора XOR, но его можно реализовать самостоятельно

Условные выражения в управляющей конструкции if

isItTrue := true

// так как неявное преобразование между числовыми и булевыми значениями в Go отсутствует if 1 делать нельзя
if isItTrue {
    println("Yes")
} else {
    println("No")
}

Для того, чтобы преобразовывать bool к int необходимо самостоятельно реализовывать преобразования.

Операторы сравнения в условных конструкциях

Go поддерживает основные операторы сравнения:

ОператорЗначение выражения будет trueЗначение выражения будет false
== (равно)true == truetrue == false
!= (не равно)true != falsetrue != true

Операторы которые используются в условных конструкциях, но не работают с типом bool

ОператорЗначение выражения будет trueЗначение выражения будет false
> (больше)3 > 22 > 3
< (меньше)2 < 32 < 3
>= (больше или равно)3 >= 32 >= 3
<= (меньше или равно)3 <= 44 <= 3

Что и как можно сравнивать?

В Go можно сравнивать только значения с полностью одинаковыми типами. Таким образом вы не можете сравнивать int с float32 и даже не сможете сравнить int32 c int.

В таблице ниже указаны типы данных и какие опрерации сравнения с ними можно использовать.

Обратите внимание на термины: сравнимость (comparable) и упорядоченность (ordered), они относятся к теме Generics, которую мы рассмотрим в дальнейшем. Поэтому объясним эти понятия простыми словами, то comparable — это типы данных, с которыми можно применять операторы == и !=, а Ordered это типы данных, с которыми можно применять операторы >, <, >=, <=.

Тип значенияСравнимость (можно использовать ==,!=)Упорядоченность ( можно использовать <, <=, >, >=)Примечания
bool✅ Да❌ НетCравниваются значения
Целые числа (int, uint и др.)✅ Да✅ ДаСравниваются значения
Числа с плавающей точкой (float32, float64)✅ Да✅ Да
Комплексные числа (complex64, complex128)✅ Да❌ Нет
Строки (string)✅ Да✅ ДаСравнение лексикографическое
Указатели (*T)✅ Да❌ НетСравниваются адреса
Интерфейсы (interface{})✅ Да❌ НетРавны, если динамический тип и значение совпадают
Каналы (chan T)✅ Да❌ НетРавны, если указывают на один и тот же канал
Структуры (struct)✅ Да*❌ НетТолько если все поля сравнимы
Массивы ([N]T)✅ Да*✅ Да*Только если элементы сравнимы
Срезы ([]T)❌ Нет❌ НетМожно сравнивать только с nil
Карты (map[K]V)❌ Нет❌ НетТолько сравнение с nil
Функции (func)❌ Нет❌ НетТолько сравнение с nil

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *