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

前のセクションでは、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/greetingsモジュールを使用するようにexample.com/helloモジュールを編集します。

    本番環境で使用する場合は、example.com/greetingsモジュールをリポジトリ(公開場所を反映したモジュールパス付き)から公開し、Goツールがダウンロードするために見つけられるようにします。今のところ、まだモジュールを公開していないため、ローカルファイルシステムでexample.com/greetingsコードを見つけられるようにexample.com/helloモジュールを適合させる必要があります。

    これを行うには、go mod editコマンドを使用して、Goツールをモジュールパス(モジュールがない場所)からローカルディレクトリ(モジュールがある場所)にリダイレクトするようにexample.com/helloモジュールを編集します。

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

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

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

      require example.com/greetings v1.1.0

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

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

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

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