別のモジュールからコードを呼び出す

前のセクションでは、greetingsモジュールを作成しました。このセクションでは、先ほど作成したモジュール内のHello関数を呼び出すコードを記述します。アプリケーションとして実行でき、greetingsモジュール内のコードを呼び出すコードを記述します。

  1. Goモジュールのソースコード用にhelloディレクトリを作成します。ここに呼び出し元を記述します。

    このディレクトリを作成した後、次のように階層の同じレベルに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() {
        // Get a greeting message and print it.
        message := greetings.Hello("Gladys")
        fmt.Println(message)
    }
    

    このコードでは、以下のことを行います。

    • mainパッケージを宣言します。Goでは、アプリケーションとして実行されるコードはmainパッケージに含まれている必要があります。
    • example.com/greetingsfmtパッケージの2つのパッケージをインポートします。これにより、コードはこれらのパッケージ内の関数にアクセスできるようになります。example.com/greetings(以前に作成したモジュールに含まれるパッケージ)をインポートすると、Hello関数にアクセスできます。また、入力および出力テキストを処理する関数(コンソールにテキストを印刷するなど)を含むfmtもインポートします。
    • greetingsパッケージのHello関数を呼び出して挨拶を取得します。
  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に置き換えることを指定します。コマンドを実行すると、helloディレクトリのgo.modファイルにはreplaceディレクティブが含まれるはずです。

      module example.com/hello
      
      go 1.16
      
      replace example.com/greetings => ../greetings
      
    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
      

      コマンドが完了すると、example.com/helloモジュールのgo.modファイルは次のようになります。

      module example.com/hello
      
      go 1.16
      
      replace example.com/greetings => ../greetings
      
      require example.com/greetings v0.0.0-00010101000000-000000000000

      このコマンドはgreetingsディレクトリ内のローカルコードを見つけ、example.com/helloexample.com/greetingsを必要とすることを指定するrequireディレクティブを追加しました。この依存関係は、hello.goでgreetingsパッケージをインポートしたときに作成されました。

      モジュールパスの後の数字は擬似バージョン番号です。これは、セマンティックバージョン番号(モジュールにはまだありません)の代わりに使用される生成された番号です。

      公開されたモジュールを参照するには、go.modファイルは通常、replaceディレクティブを省略し、最後にタグ付きバージョン番号を持つrequireディレクティブを使用します。

      require example.com/greetings v1.1.0

      バージョン番号の詳細については、モジュールのバージョン番号付けを参照してください。

  6. helloディレクトリのコマンドプロンプトでコードを実行して、動作することを確認します。
    $ go run .
    Hi, Gladys. Welcome!
    

おめでとうございます!2つの機能的なモジュールを作成しました。

次のトピックでは、エラー処理を追加します。