Тип 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 == true | true == false |
| != (не равно) | true != false | true != true |
Операторы которые используются в условных конструкциях, но не работают с типом bool
| Оператор | Значение выражения будет true | Значение выражения будет false |
| > (больше) | 3 > 2 | 2 > 3 |
| < (меньше) | 2 < 3 | 2 < 3 |
| >= (больше или равно) | 3 >= 3 | 2 >= 3 |
| <= (меньше или равно) | 3 <= 4 | 4 <= 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 |
Leave a Reply