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

Использование go mod init для создания модулей Golang

Автор

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

Модульная система в Go позволяет эффективно управлять зависимостями и структурировать код. С помощью команды go mod init можно инициализировать новый модуль, который станет основой для проекта. В этой статье я покажу, как создать модуль в Go, зачем он нужен и какие возможности предоставляет. Также разберём, как работать с зависимостями в рамках модуля.

Что такое модуль в Go?

Смотрите, в Go модуль — это логическая единица кода, которая включает пакеты и зависимости. Система модулей появилась в Go 1.11 и заменила старый подход с GOPATH, упростив работу с внешними библиотеками.

Каждый модуль содержит файл go.mod, который определяет:

  • имя модуля,
  • используемую версию Go,
  • список зависимостей и их версии.

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

Создание модуля с go mod init

Чтобы создать новый модуль, выполните команду:

go mod init example.com/mymodule

Здесь example.com/mymodule — это имя модуля. Оно не обязательно должно быть реальным доменом, но если вы планируете распространять модуль, лучше использовать уникальное название, например, привязанное к вашему репозиторию на GitHub.

После выполнения команды в корневой директории проекта появится файл go.mod следующего вида:

module example.com/mymodule

go 1.20

Файл go.mod хранит метаданные о модуле и его зависимостях.

Добавление зависимостей

В Go зависимости подключаются автоматически при первом их использовании. Например, если вы импортируете пакет github.com/sirupsen/logrus, то после первого вызова go build или go run в файле go.mod появится строка с этим пакетом.

Можно также вручную добавить зависимость командой:

go get github.com/sirupsen/logrus@latest

Если вам нужна конкретная версия, укажите её явно:

go get github.com/sirupsen/logrus@v1.8.1

После этого в файле go.mod появится запись с точной версией пакета, а в go.sum — контрольные суммы для проверки целостности зависимостей.

Работа с версиями

Go использует семантическое версионирование (SemVer). Основные правила:

  • Минорные обновления (v1.2.0v1.3.0) должны быть совместимы.
  • Мажорные версии (v1.x.xv2.0.0) могут содержать несовместимые изменения.

При обновлении зависимостей можно использовать:

go get -u ./...

Это обновит все зависимости до последних минорных версий. Если нужно обновить всё до мажорных версий, используйте:

go get -u=patch ./...

Организация кода внутри модуля

Смотрите, после инициализации модуля можно организовать код по пакетам. Например:

mymodule/
 ├── go.mod
 ├── main.go
 ├── pkg/
 │   ├── utils/
 │   │   ├── utils.go
 ├── internal/
 │   ├── auth/
 │   │   ├── auth.go
  • pkg/ — для публичных библиотек, доступных за пределами модуля.
  • internal/ — для внутренних пакетов, которые не могут быть импортированы извне.
  • main.go — точка входа, если проект является исполняемым файлом.

Пример кода для utils.go:

package utils

import "fmt"

func SayHello(name string) {
    fmt.Println("Hello,", name)
}

В main.go можно использовать этот пакет так:

package main

import (
    "example.com/mymodule/pkg/utils"
)

func main() {
    utils.SayHello("Gopher")
}

Проверка модуля и зависимостей

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

go mod tidy

Она удалит ненужные зависимости и обновит go.mod и go.sum.

Также можно проверить, какие модули используются в проекте:

go list -m all

Заключение

Go-модули упростили управление зависимостями, устранив проблемы GOPATH. Теперь каждый проект имеет свой go.mod, который фиксирует нужные версии пакетов.

Здесь я показал, как создать модуль с go mod init, подключить зависимости и организовать код внутри модуля. Используйте go mod tidy для очистки зависимостей и go get для их обновления.

Такой подход делает проекты в Go более предсказуемыми и удобными в работе, особенно в командной разработке.

Стрелочка влевоGo Playground и компилятор GolangРабота с переменными окружения (env) в GolangСтрелочка вправо

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