別のモジュールからコードを呼び出す
前のセクションでは、greetingsモジュールを作成しました。このセクションでは、先ほど作成したモジュール内のHello関数を呼び出すコードを記述します。アプリケーションとして実行でき、greetingsモジュール内のコードを呼び出すコードを記述します。
- Goモジュールのソースコード用に
helloディレクトリを作成します。ここに呼び出し元を記述します。このディレクトリを作成した後、次のように階層の同じレベルに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() { // Get a greeting message and print it. message := greetings.Hello("Gladys") fmt.Println(message) }このコードでは、以下のことを行います。
mainパッケージを宣言します。Goでは、アプリケーションとして実行されるコードはmainパッケージに含まれている必要があります。example.com/greetingsとfmtパッケージの2つのパッケージをインポートします。これにより、コードはこれらのパッケージ内の関数にアクセスできるようになります。example.com/greetings(以前に作成したモジュールに含まれるパッケージ)をインポートすると、Hello関数にアクセスできます。また、入力および出力テキストを処理する関数(コンソールにテキストを印刷するなど)を含むfmtもインポートします。greetingsパッケージのHello関数を呼び出して挨拶を取得します。
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に置き換えることを指定します。コマンドを実行すると、helloディレクトリのgo.modファイルにはreplaceディレクティブが含まれるはずです。module example.com/hello go 1.16 replace example.com/greetings => ../greetings
- 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/helloがexample.com/greetingsを必要とすることを指定するrequireディレクティブを追加しました。この依存関係は、hello.goでgreetingsパッケージをインポートしたときに作成されました。モジュールパスの後の数字は擬似バージョン番号です。これは、セマンティックバージョン番号(モジュールにはまだありません)の代わりに使用される生成された番号です。
公開されたモジュールを参照するには、go.modファイルは通常、
replaceディレクティブを省略し、最後にタグ付きバージョン番号を持つrequireディレクティブを使用します。require example.com/greetings v1.1.0
バージョン番号の詳細については、モジュールのバージョン番号付けを参照してください。
- helloディレクトリのコマンドプロンプトから、次のコマンドを実行します。
helloディレクトリのコマンドプロンプトでコードを実行して、動作することを確認します。$ go run . Hi, Gladys. Welcome!
おめでとうございます!2つの機能的なモジュールを作成しました。
次のトピックでは、エラー処理を追加します。