Понимание модулей в Golang

В моей предыдущей статье про понимание пакетов мы говорили о том, что такое пакет, о потенциальной структуре пакетов, о разбиении пакетов на несколько файлов, об экспорте методов и функций и т. д.

Сегодня мы пойдем немного дальше и обсудим модули в языке программирования Go (Golang) и то, как они связывают пакеты воедино.

Мы можем думать о модулях как о коллекциях пакетов, это означает, что модуль — это, по сути, просто папка, в которой находится один или несколько пакетов. Модуль может состоять из одного пакета, в этом случае имя модуля и пакета будет одинаковым. Достаточно разговоров, давайте посмотрим на примеры.

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

У нас также есть странный файл go.mod. Если вы знакомы с JavaScript, вы можете сравнить его с файлом package.json в ваших проектах или Gemfile в ваших проектах на Ruby. По сути, он содержит информацию, которая описывает модуль — в данном случае модуль калькулятора — и перечисляет зависимости всех пакетов в этом модуле, это может выглядеть примерно так.

Как мы сюда попали?

Давайте напишем небольшой модуль, назовем его calculator, и будем использовать его в другой программе на Go. Если на вашей машине еще не установлен Go, перейдите сюда и следуйте красиво написанным инструкциям. Данный материал я переведу в самое ближайшее время.

Далее создайте новую директорию, в которой будет храниться ваш код, у меня это будет Desktop/Playground/go.

Вы, вероятно, задаетесь вопросом о том, что такое go.mod. Если вы работаете на JavaScript, создание файла go.mod похоже на запуск yarn init или npm init, который вы просто выполняете в терминале.

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

Далее создайте несколько пакетов в вашем модуле calculator.

Давайте добавим несколько операций, создадим simple.go в директории /operations.

Внутри файла simple.go поместите следующий код.

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

Давайте напишем код для отображения результатов, запустим его из каталога калькулятора.

Внутри format.go добавим следующий код.

Нам потребуется внести некоторые изменения в simple.go, давайте импортируем наш пакет форматирования и с его помощью добавим 2 новые функции в simple.go.

Здесь мы добавили 2 новые функции, которые выводят шаги, используемые в операции — AdditionWithSteps и MultiplicationWithSteps, а также немного рефакторинга.

Теперь давайте сделаем этот пакет доступным для использования в других программах на Go. Поместите его в репозиторий, который вы создали для своего проекта. Я использую GitHub для хранения своего проекта, и имя моего репозитория — calculator.

Теперь я сделаю коммит и отправлю свой код на Github.

Если все прошло успешно, при обновлении браузера страница репозитория должна выглядеть следующим образом.

Теперь ваш пакет доступен всем, кто захочет его использовать! Если вы хотите, чтобы люди использовали ваш пакет, убедитесь, что ваш репозиторий не является приватным, иначе импорт может не состояться. Старайтесь избегать дефисов и других специальных символов при именовании модуля и репозитория. Каждый репозиторий должен содержать только один модуль, иначе вы столкнетесь с проблемами, когда начнете импортировать свой модуль для использования.

Давайте напишем немного go-кода для использования нашего модуля и пакетов! В корневой директории вашего проекта создайте новый модуль, назовите его как угодно, я назову свой simplego, а внутри него — main.go для нашего кода.

Внутри файла main.go в следующем коде мы импортируем пакет операций, который мы создали ранее в нашем модуле калькулятора.

Если все прошло успешно, вы должны увидеть некоторые ошибки, похожие на ту, что приведена ниже. Это происходит потому, что у нас технически нет этого пакета, установленного локально для использования. Нам нужно сказать go, чтобы он его получил, я имею в виду, буквально сказать go, чтобы он его получил.

Ошибка в нижней части экрана, показывающая, что пакет недоступен для нас локально
Ошибка в нижней части экрана, показывающая, что пакет недоступен для нас локально

В терминале инициализируйте новый файл модуля go и сообщите go, чтобы он привел в порядок ваши зависимости. Запустите это в корне вашего модуля simplego, вы должны получить результат, приведенный в комментариях.

Что только что произошло? Ну, с помощью чудесной магии go, всякий раз, когда мы запускаем go mod tidy, go просматривает все наши операторы импорта и загружает все недостающие пакеты/зависимости. Теперь наш файл go.mod должен выглядеть следующим образом.

Теперь мы можем использовать operations в нашей программе, давайте добавим немного кода в файл main.go.

Давайте запустим нашу программу, в терминале выполните следующую команду, и вы увидите, как в окне терминала будут выведены шаги операции 1+2+3+4+5.

Оно работает!

Резюме

К настоящему моменту мы:

  • Написали небольшой модуль Go, который может выполнять некоторые арифметические действия и выводить результаты.
  • Опубликовали пакет
  • Импортировали наш опубликованный пакет в другую простую программу и использовали его

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

Здесь вы найдете код simple.go, а код нашего модуля калькулятора можно найти здесь.

Оригинал статьи
Опубликовано 31 августа 2024 в 00:32
Обновлено 31 августа 2024 в 00:32
Категория: Блог
Теги:
Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Политика конфиденциальности