логотип PurpleSchool
логотип PurpleSchool

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

Автор

Александр Гольцман

Типы данных в Golang (type)

Типы данных в языке программирования Go (или Golang) играют ключевую роль, поскольку Go — это строго типизированный язык. Это значит, что каждая переменная имеет определенный тип, который нельзя просто так изменить. Такой подход помогает избежать многих ошибок и делает код более предсказуемым. В этой статье мы разберем основные типы данных в Go, их особенности и практическое применение.

Основные категории типов данных

В Go предусмотрено несколько категорий типов данных, которые можно разделить на следующие группы:

  1. Числовые — включают в себя как целые числа, так и числа с плавающей запятой.
  2. Булевый — логический тип, содержащий значения true или false.
  3. Строки — представляют собой последовательность символов в кодировке UTF-8.
  4. Срезы и массивы — структуры для хранения данных, схожие, но имеющие различия.
  5. Карты (map) — удобный способ хранения данных в виде пар "ключ-значение".
  6. Структуры (struct) — позволяют объединять несколько значений в единую сущность.
  7. Указатели (pointer) — используются для работы с адресами памяти.
  8. Интерфейсы (interface) — описывают поведение объектов через набор методов.
  9. Каналы (channel) — обеспечивают взаимодействие между горутинами.

Давайте подробнее рассмотрим каждый из них.

Числовые типы

В Go есть несколько разновидностей числовых типов:

  • Целые числа: int, int8, int16, int32, int64.
  • Беззнаковые целые числа: uint, uint8, uint16, uint32, uint64.
  • Числа с плавающей запятой: float32, float64.
  • Комплексные числа: complex64, complex128.
  • Дополнительные типы: byte (аналог uint8) и rune (аналог int32, используется для хранения символов Unicode).

По умолчанию, если вы объявляете целочисленную переменную без указания типа, Go присваивает ей int, а для чисел с плавающей запятой используется float64.

Булевый тип

Булевый тип (bool) в Go принимает два значения: true или false. Он часто применяется в условных выражениях. Например:

isReady := true
if isReady {
    fmt.Println("Программа готова к запуску!")
}

Важный момент: в Go нет автоматического приведения типов, поэтому нельзя, например, использовать 1 вместо true.

Строки

Строки (string) в Go представляют собой неизменяемую последовательность байтов в кодировке UTF-8. Это означает, что после создания строку нельзя изменить напрямую.

Покажу на примере:

message := "Привет, Golang!"
fmt.Println(len(message)) // Длина строки в байтах

Если вам нужно работать с символами внутри строки, учитывайте, что len() возвращает количество байтов, а не символов. Чтобы корректно обрабатывать многобайтовые символы, лучше использовать rune.

Срезы и массивы

В Go есть как массивы, так и более гибкие срезы. Подробнее…

  • Массив имеет фиксированный размер:
var arr [3]int = [3]int{1, 2, 3}
  • Срез — это динамическая структура, которая может изменяться:
slice := []int{1, 2, 3, 4}
slice = append(slice, 5) // Добавляем элемент

Срезы чаще используются в Go, так как они удобнее и гибче массивов.

Карты (map)

Карты (map) позволяют хранить данные в формате "ключ-значение". Это мощный инструмент для быстрого поиска данных по ключу. Подробнее…

Создадим карту с возрастами пользователей:

users := map[string]int{
    "Алиса": 25,
    "Боб":   30,
}
fmt.Println(users["Алиса"]) // 25

Карты очень удобны, если вам нужно быстро находить значения по определенному ключу.

Структуры (struct)

Если вам нужно объединить несколько значений в один объект, используйте struct.

Пример структуры, описывающей человека:

type Person struct {
    Name string
    Age  int
}

p := Person{Name: "Алиса", Age: 25}
fmt.Println(p.Name) // Алиса

Структуры широко используются при работе с данными, например, в API или базах данных.

Указатели (pointer)

Указатели позволяют ссылаться на переменные в памяти.

Смотрите, как это работает:

var a int = 42
var p *int = &a // Указатель на a
fmt.Println(*p) // 42 (разыменовывание указателя)

Указатели полезны, когда нужно изменять данные внутри функций, не копируя их.

Интерфейсы (interface)

Интерфейсы позволяют описывать поведение объектов через набор методов.

Пример:

type Speaker interface {
    Speak() string
}

type Human struct{}

func (h Human) Speak() string {
    return "Hello!"
}

var s Speaker = Human{}
fmt.Println(s.Speak()) // Hello!

Интерфейсы помогают писать гибкий код, особенно в больших проектах.

Каналы (channel)

Каналы используются для взаимодействия между горутинами (параллельными процессами).

Пример канала, передающего данные:

ch := make(chan int)

go func() { ch <- 42 }() // Отправляем значение в канал

fmt.Println(<-ch) // Получаем 42

Каналы важны для конкурентного программирования в Go.

Заключение

В этой статье я постарался рассказать о ключевых типах данных в Go и их применении. Мы рассмотрели числа, строки, булевые значения, массивы, срезы, карты, структуры, указатели, интерфейсы и каналы. Понимание этих концепций поможет вам писать более надежный и эффективный код. Если у вас есть вопросы или хочется глубже разобраться в какой-то теме — пробуйте примеры на практике!

Стрелочка влевоДженерик %T и его применение в GolangИспользование tls в GolangСтрелочка вправо

Постройте личный план изучения Golang до уровня Middle — бесплатно!

Golang — часть карты развития Backend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Основы Golang

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее