別のモジュールからコードを呼び出す
前のセクションでは、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/greetings
モジュールを使用するようにexample.com/hello
モジュールを編集します。本番環境で使用する場合は、
example.com/greetings
モジュールをリポジトリ(公開場所を反映したモジュールパス付き)から公開し、Goツールがダウンロードするために見つけられるようにします。今のところ、まだモジュールを公開していないため、ローカルファイルシステムでexample.com/greetings
コードを見つけられるようにexample.com/hello
モジュールを適合させる必要があります。これを行うには、
go mod edit
コマンドを使用して、Goツールをモジュールパス(モジュールがない場所)からローカルディレクトリ(モジュールがある場所)にリダイレクトするようにexample.com/hello
モジュールを編集します。- 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ディレクトリでローカルコードを見つけ、
require
ディレクティブを追加して、example.com/hello
がexample.com/greetings
を必要とすることを指定しました。hello.goでgreetings
パッケージをインポートしたときに、この依存関係を作成しました。モジュールパスの後の数値は、疑似バージョン番号です。これは、セマンティックバージョン番号(モジュールにはまだない)の代わりに使用される生成された数値です。
公開モジュールを参照するには、go.modファイルは通常、
replace
ディレクティブを省略し、最後にタグ付きのバージョン番号を含むrequire
ディレクティブを使用します。require example.com/greetings v1.1.0
バージョン番号の詳細については、モジュールのバージョン番号付けを参照してください。
- helloディレクトリのコマンドプロンプトから、次のコマンドを実行します。
hello
ディレクトリのコマンドプロンプトで、コードを実行して機能することを確認します。$ go run . Hi, Gladys. Welcome!
おめでとうございます。2つの機能するモジュールを作成しました。
次のトピックでは、エラー処理を追加します。