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

Пакеты в Golang

Автор

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

Пакеты в Golang

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

Что такое пакет в Go?

В Go вся программа состоит из пакетов. Даже самый простой Go-код является частью какого-либо пакета. Пакеты позволяют разделять код на модули и управлять зависимостями между ними. В стандартной библиотеке Go уже есть множество встроенных пакетов, например, fmt для работы с форматированным выводом или net/http для работы с HTTP.

Каждый файл в Go начинается с объявления пакета:

package main

Здесь main — это особый пакет, с которого начинается выполнение программы. Если ваш код не предназначен для создания исполняемого файла, а, например, используется как библиотека, то он будет принадлежать другому пакету.

Создание собственного пакета

Смотрите, если вы хотите создать свой пакет, просто разместите нужные файлы в отдельной директории и укажите в них соответствующее имя пакета.

Структура проекта с пакетами

Вот простая структура проекта, в котором есть свой пакет:

my_project/
│── main.go
│── mathutil/
│   ├── mathutil.go

Файл mathutil.go содержит пакет mathutil:

package mathutil

// Add складывает два числа и возвращает результат
func Add(a, b int) int {
    return a + b
}

А теперь в main.go мы можем использовать этот пакет:

package main

import (
    "fmt"
    "my_project/mathutil"
)

func main() {
    result := mathutil.Add(3, 5)
    fmt.Println("Результат:", result)
}

Здесь я импортировал пакет mathutil и использовал его функцию Add.

Встроенные пакеты в Go

Go поставляется с мощной стандартной библиотекой, которая включает множество полезных пакетов. Вот некоторые из них:

  • fmt — работа с форматированным выводом
  • strings — операции над строками
  • math — математические функции
  • net/http — работа с HTTP
  • os — взаимодействие с операционной системой

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

import "fmt"

Публичные и приватные элементы пакетов

В Go действует простое правило:

  • Если название идентификатора начинается с заглавной буквы, оно экспортируется и доступно из других пакетов.
  • Если название начинается со строчной буквы, оно остается приватным внутри пакета.

Пример:

package example

var PublicVar = 42   // Экспортируется
var privateVar = 10  // Не экспортируется

В другом пакете можно использовать PublicVar, но privateVar будет недоступен.

Заключение

Пакеты в Go помогают структурировать код и делают его удобным для поддержки и повторного использования. Мы разобрали, как объявлять и использовать пакеты, как организовать структуру проекта и как работают публичные и приватные элементы. Старайтесь правильно разбивать код на логические части, чтобы ваш проект оставался чистым и понятным.

Стрелочка влевоПаника и обработка ошибок в GolangИмпорт пакетов в GoСтрелочка вправо

Все гайды по 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
Открыть базу знаний