Вызов кода из другого модуля
В предыдущем разделе вы создали
модуль greetings. В этом разделе вы напишете код, который будет
вызывать функцию Hello в модуле, который вы только что написали. Вы
напишете код, который можно выполнить как приложение и который вызывает код в
модуле greetings.
-
Создайте каталог
helloдля исходного кода Go модуля. Это будет место, где вы напишете вызывающий код.После создания этого каталога вы должны иметь оба каталога — hello и greetings — на одном уровне иерархии, как показано ниже:
<home>/ |-- greetings/ |-- hello/
Например, если ваша командная строка находится в каталоге greetings, вы можете использовать следующие команды:
cd .. mkdir hello cd hello
-
Включите отслеживание зависимостей для кода, который вы собираетесь написать.
Чтобы включить отслеживание зависимостей для вашего кода, выполните команду
go mod init, указав имя модуля, в котором будет находиться ваш код.В целях этого руководства используйте
example.com/helloв качестве пути модуля.$ go mod init example.com/hello go: creating new go.mod: module example.com/hello
- В вашем текстовом редакторе, в каталоге hello, создайте файл для записи кода и назовите его hello.go.
-
Напишите код для вызова функции
Hello, а затем распечатайте значение, возвращаемое функцией.Для этого вставьте следующий код в файл hello.go.
package main import ( "fmt" "example.com/greetings" ) func main() { // Получаем приветственное сообщение и выводим его. message := greetings.Hello("Gladys") fmt.Println(message) }В этом коде вы:
-
Объявляете пакет
main. В Go код, выполняемый как приложение, должен находиться в пакетеmain. -
Импортируете два пакета:
example.com/greetingsиfmtпакет. Это даёт вашему коду доступ к функциям этих пакетов. Импортируяexample.com/greetings(пакет, содержащийся в модуле, который вы создали ранее), вы получаете доступ к функцииHello. Вы также импортируетеfmt, который содержит функции для обработки текстового ввода и вывода (например, печать текста в консоль). -
Получаете приветствие, вызвав функцию
Helloпакетаgreetings.
-
Объявляете пакет
-
Отредактируйте модуль
example.com/hello, чтобы он использовал локальный модульexample.com/greetings.Для использования в продакшене, вы бы опубликовали модуль
example.com/greetingsиз его репозитория (с путём модуля, отражающим его опубликованное расположение), где инструменты Go могли бы найти его для загрузки. Пока же, поскольку вы ещё не опубликовали модуль, вам нужно адаптировать модульexample.com/hello, чтобы он мог находить кодexample.com/greetingsв локальной файловой системе.Для этого используйте команду
go mod editдля редактирования модуляexample.com/hello, чтобы перенаправить инструменты Go с его пути модуля (где модуль не находится) на локальный каталог (где он находится).-
Из командной строки в каталоге hello выполните следующую команду:
$ go mod edit -replace example.com/greetings=../greetings
Команда указывает, что
example.com/greetingsдолжно быть заменено на../greetingsдля целей поиска зависимости. После выполнения команды файл go.mod в каталоге hello должен содержать директивуreplace:module example.com/hello go 1.16 <ins>replace example.com/greetings => ../greetings</ins>
-
Из командной строки в каталоге hello выполните команду
go mod tidy, чтобы синхронизировать зависимости модуляexample.com/hello, добавив те, которые требуются кодом, но ещё не отслеживаются в модуле.$ go mod tidy go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000
После завершения команды файл go.mod модуля
example.com/helloдолжен выглядеть так:module example.com/hello go 1.16 <ins>require example.com/greetings v0.0.0-00010101000000-000000000000</ins>
Команда нашла локальный код в каталоге greetings, а затем добавила директиву
require, чтобы указать, чтоexample.com/helloзависит отexample.com/greetings. Вы создали эту зависимость при импорте пакетаgreetingsв hello.go.Число после пути модуля — это псевдо-номер версии — сгенерированное число, используемое вместо семантического номера версии (которого у модуля ещё нет).
Для ссылки на опубликованный модуль файл go.mod обычно опускает директиву
replaceи использует директивуrequireс тегированным номером версии в конце.require example.com/greetings v1.1.0
Для получения дополнительной информации о номерах версий см. Нумерация версий модулей.
-
Из командной строки в каталоге hello выполните следующую команду:
-
В командной строке в каталоге
helloзапустите ваш код, чтобы подтвердить, что он работает.$ go run . Hi, Gladys. Welcome!
Поздравляем! Вы написали два рабочих модуля.
В следующей теме вы добавите обработку ошибок.