Эта глава — фундамент. В Go типы данных — это не просто формальность, а способ заставить компилятор проверять логику вашей программы ещё до её запуска.
В предыдущей главе мы использовали строки, чтобы вывести «Hello, World!». Тип данных определяет:
- Какие значения может принимать переменная.
- Какие операции над ними можно проводить.
- Как именно эти данные будут храниться в памяти компьютера.
Go — это язык со статической типизацией. Это значит, что тип переменной известен в момент компиляции и не может измениться во время работы программы. На первый взгляд это кажется строгим ограничением, но именно это позволяет Go быть таким быстрым и надежным.
Числа
В Go числа делятся на целые и числа с плавающей точкой (вещественные).
Целые числа (Integers)
Целые числа не имеют дробной части. Компьютеры используют двоичную систему (биты: 0 или 1).
В Go существует множество целочисленных типов, различающихся размером (количеством бит) и наличием знака (+/-):
| Тип | Размер | Диапазон (примерный) |
|---|---|---|
| int8 | 8 бит | от -128 до 127 |
| uint8 | 8 бит | от 0 до 255 (беззнаковое) |
| int64 | 64 бита | очень большие числа |
| byte | 8 бит | Псевдоним для uint8 (используется для сырых данных) |
| rune | 32 бита | Псевдоним для int32 (используется для символов Unicode) |
Важное правило: В большинстве случаев используйте просто тип int. Он автоматически подстроится под архитектуру вашего процессора (станет 32 или 64 битным).
Числа с плавающей точкой (Floating Point)
Это числа с десятичной запятой (например, 1.234).
- float32: одинарная точность.
- float64: двойная точность (используйте его по умолчанию).
[!WARNING] Осторожно с точностью Числа с плавающей точкой неточны. Например, результат
1.01 - 0.99может быть0.020000000000000018. Никогда не используйте их для финансовых расчетов, где важна абсолютная точность до копейки.
Пример работы с числами
package main
import "fmt"
func main() {
fmt.Println("1 + 1 =", 1 + 1) // Сложение целых чисел
fmt.Println("1.1 + 1.1 =", 1.1 + 1.1) // Сложение float64
}
Строки (Strings)
Строка — это последовательность символов. В Go строки неизменяемы (immutable) и используют кодировку UTF-8 по умолчанию.
- Двойные кавычки:
"Привет"— поддерживают управляющие символы вроде\n(новая строка) или\t(табуляция). - Обратные апострофы:
Текст— «сырые» строки. В них текст отображается ровно так, как написан (включая переносы строк).
Операции над строками
len("Привет")— возвращает количество байтов в строке (внимание: русские буквы занимают по 2 байта!)."Hello " + "World"— конкатенация (склеивание)."Hello"[0]— получение байта по индексу (вернет числовое значение символа).
package main
import "fmt"
func main() {
fmt.Println(len("Hello World")) // 11
fmt.Println("Hello World"[1]) // 101 (код символа 'e')
fmt.Println("Gold" + "ang") // Goldang
}
Логический тип (Boolean)
Булевский тип может принимать только два значения: true (истина) и false (ложь).
Логические операторы
| Оператор | Описание | Пример |
|---|---|---|
| && | И (AND) | true && false даст false |
| ** | ** | |
| ! | НЕ (NOT) | !true даст false |
Таблица истинности (кратко)
&&возвращаетtrueтолько если оба значения истинны.||возвращаетtrue, если хотя бы одно значение истинно.
Задачи
- Калькулятор: Напишите программу, которая вычисляет результат умножения
32132 * 42452. - Эксперимент со строками: Что выведет
fmt.Println(len("Go")), а чтоfmt.Println(len("Го"))? Почему результаты разные? (Подсказка: UTF-8). - Логика: Каков результат выражения
(true && false) || (false && true) || !(false && false)? Попробуйте вычислить в уме, а затем проверьте программой. - Типы: Какой тип данных лучше всего подойдет для хранения возраста человека? А для курса валют?