Golang: Логический тип
В Go логический тип (bool
) используется для представления двух значений: true
(истина) и false
(ложь).
Логические операторы
Логические операторы в Go позволяют комбинировать или изменять булевы значения (true
и false
). Они часто используются в условиях (if
, for
) и при построении сложных выражений.
Go поддерживает классические логические операции:
&&
— логическое «и» (возвращаетtrue
, если оба операнда истинны)||
— логическое «или» (возвращаетtrue
, если хотя бы один операнд истинен)!
— логическое «не» (инвертирует значение:!true
становитсяfalse
)==
— сравнение на равенство!=
— сравнение на неравенство
Примеры:
// false
true && false
// true
false || true
// true
!false
// true
true == true
// true
false != true
Объявление переменных
Переменные логического типа объявляются явно с использованием bool
или через вывод типа:
var isActive bool = true
var isAdmin bool = false
// или с выводом типа
isActive := true
isadmin := false
Переменные логического типа по умолчанию получают значение false
:
var flag bool
fmt.Println(flag)
// => false
Строгая типизация
Go — строго типизированный язык. Это значит, что логические значения нельзя смешивать с другими типами. Например, нельзя сравнивать bool
со строкой или числом:
// ошибка компиляции: mismatched types
true == "hello"
// тоже ошибка
true == 1
Чтобы проверить, что число не равно нулю, сравнение выполняют явно:
count := 5
// true
isPositive := count > 0
// false
isZero := count == 0
Для строк проверка также выполняется явно:
text := "Hexlet"
// false
isEmpty := text == ""
// true
isNotEmpty := text != ""
Булевы значения можно сравнивать только с булевыми:
isActive := true
fmt.Println(isActive == true)
// =>true
fmt.Println(isActive != false)
// =>true
Сравнение строк
Go позволяет сравнивать строки с помощью стандартных операторов:
- == — равно
- != — не равно
- <, >, <=, >= — лексикографическое сравнение (по порядку символов и длине)
Сравнение выполняется побайтно, в соответствии с кодировкой UTF-8.
"hexlet" == "hexlet"
// true
"go" < "golang"
// true
"beta" > "alpha"
// true
"foo" != "bar"
// true
Использование в функциях
Сравнения полезны даже без использования условных конструкций. Таким образом часто пишут функции-предикаты, то есть функции, которые выполняют проверки и возвращают булево значение.
func isEmpty(text string) bool {
return text == ""
}
func isEqual(a, b int) bool {
return a == b
}
func bothTrue(a, b bool) bool {
return a && b
}
Примеры вызовов:
isEmpty("")
// true
isEmpty("Hexlet")
// false
isEqual(4, 4)
// true
isEqual(4, 7)
// false
bothTrue(true, false)
// false
bothTrue(true, true)
// true
Задание
Реализуйте функцию IsEven()
, которая принимает целое число и возвращает true
, если число чётное, и false
— если нечётное. Нельзя использовать встроенные функции для определения чётности — только арифметику и операторы.
Примеры
IsEven(5) // false
IsEven(6) // true
IsEven(0) // true
IsEven(-4) // true
IsEven(-3) // false
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
package solution
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestIsEven(t *testing.T) {
a := assert.New(t)
a.False(IsEven(5))
a.True(IsEven(6))
a.True(IsEven(0))
a.True(IsEven(-2))
a.False(IsEven(-3))
}
Решение учителя откроется через:
20:00
