Вызов кода из другого модуля

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

  1. Создайте каталог hello для исходного кода Go модуля. Это будет место, где вы напишете вызывающий код.

    После создания этого каталога вы должны иметь оба каталога — hello и greetings — на одном уровне иерархии, как показано ниже:

    <home>/
    |-- greetings/
    |-- hello/

    Например, если ваша командная строка находится в каталоге greetings, вы можете использовать следующие команды:

    cd ..
    mkdir hello
    cd hello
    
  2. Включите отслеживание зависимостей для кода, который вы собираетесь написать.

    Чтобы включить отслеживание зависимостей для вашего кода, выполните команду go mod init, указав имя модуля, в котором будет находиться ваш код.

    В целях этого руководства используйте example.com/hello в качестве пути модуля.

    $ go mod init example.com/hello
    go: creating new go.mod: module example.com/hello
    
  3. В вашем текстовом редакторе, в каталоге hello, создайте файл для записи кода и назовите его hello.go.
  4. Напишите код для вызова функции 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.
  5. Отредактируйте модуль example.com/hello, чтобы он использовал локальный модуль example.com/greetings.

    Для использования в продакшене, вы бы опубликовали модуль example.com/greetings из его репозитория (с путём модуля, отражающим его опубликованное расположение), где инструменты Go могли бы найти его для загрузки. Пока же, поскольку вы ещё не опубликовали модуль, вам нужно адаптировать модуль example.com/hello, чтобы он мог находить код example.com/greetings в локальной файловой системе.

    Для этого используйте команду go mod edit для редактирования модуля example.com/hello, чтобы перенаправить инструменты Go с его пути модуля (где модуль не находится) на локальный каталог (где он находится).

    1. Из командной строки в каталоге 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>
      
    2. Из командной строки в каталоге 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

      Для получения дополнительной информации о номерах версий см. Нумерация версий модулей.

  6. В командной строке в каталоге hello запустите ваш код, чтобы подтвердить, что он работает.
    $ go run .
    Hi, Gladys. Welcome!
    

Поздравляем! Вы написали два рабочих модуля.

В следующей теме вы добавите обработку ошибок.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang