Типы данных в Go

Эта глава — фундамент. В Go типы данных — это не просто формальность, а способ заставить компилятор проверять логику вашей программы ещё до её запуска.

В предыдущей главе мы использовали строки, чтобы вывести «Hello, World!». Тип данных определяет:

  1. Какие значения может принимать переменная.
  2. Какие операции над ними можно проводить.
  3. Как именно эти данные будут храниться в памяти компьютера.

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 по умолчанию.

  1. Двойные кавычки: "Привет" — поддерживают управляющие символы вроде \n (новая строка) или \t (табуляция).
  2. Обратные апострофы: Текст — «сырые» строки. В них текст отображается ровно так, как написан (включая переносы строк).

Операции над строками

  • 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, если хотя бы одно значение истинно.

Задачи

  1. Калькулятор: Напишите программу, которая вычисляет результат умножения 32132 * 42452.
  2. Эксперимент со строками: Что выведет fmt.Println(len("Go")), а что fmt.Println(len("Го"))? Почему результаты разные? (Подсказка: UTF-8).
  3. Логика: Каков результат выражения (true && false) || (false && true) || !(false && false)? Попробуйте вычислить в уме, а затем проверьте программой.
  4. Типы: Какой тип данных лучше всего подойдет для хранения возраста человека? А для курса валют?

Полезные ссылки