こんにちは。よっしーです(^^)
今日は、Golangで作成した自作のパッケージを利用する方法についてご紹介します。
前提条件
前回の記事では、greetingsモジュールを作成しました。
本記事では、greetingsモジュール内のHello関数を呼び出すコードを記述します。
そのため、下記の記事が実行できる環境にあることを前提にしていますので、参考にお願いします。
利用方法
作業ディレクトリを作成して、移動する。
mkdir 06_learn-golang-use-my-module
cd 06_learn-golang-use-my-module
asdfコマンドで使用するGolangのバージョンを指定します。
すでにGolangが実行できる状態にある方は、このコマンドをスキップしても問題ありません。
asdf local golang 1.20.5
前回作成したGoモジュールのgreetingsディレクトリをコピーします。
cp -r ../05_learn-golang-create-module/greetings .
Goモジュールのソースコード用にhelloディレクトリを作成します。ここに呼び出し元を書きます。
mkdir hello
cd hello
これから書くコードの依存性の追跡を有効にする。
コードの依存性追跡を有効にするには、go mod initコマンドを実行し、コードが属するモジュールの名前を指定します。
ここでは、モジュールのパスに example.com/hello を使用します。
go mod init example.com/hello
hello.goというファイルを用意します。
touch hello.go
以下のコードを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)
}
example.com/helloモジュールを編集して、ローカルのexample.com/greetingsモジュールを使用するようにします。
実運用では、example.com/greetings モジュールをリポジトリに公開し(公開場所を反映したモジュールパスを指定)、Go ツールがそれを見つけてダウンロードできるようにします。今はまだモジュールを公開していないので、example.com/helloモジュールを適応させて、ローカルファイルシステム上のexample.com/greetingsコードを見つけることができるようにする必要があります。
そのためには、go mod editコマンドを使ってexample.com/helloモジュールを編集し、Go toolsをモジュールパス(モジュールがない場所)からローカルディレクトリ(モジュールがある場所)へリダイレクトします。
helloディレクトリのコマンドプロンプトから、以下のコマンドを実行します。
go mod edit -replace example.com/greetings=../greetings
このコマンドは、example.com/greetingsを、依存関係を見つける目的で./greetingsに置き換えるべきことを指定します。このコマンドを実行すると、helloディレクトリのgo.modファイルにはreplaceディレクティブが含まれるはずです。
module example.com/hello
go 1.20
replace example.com/greetings => ../greetings
helloディレクトリのコマンドプロンプトから、go mod tidyコマンドを実行してexample.com/helloモジュールの依存関係を同期させ、コードで必要だがまだモジュールで追跡されていないものを追加します。
go mod tidy
コマンドが完了すると、example.com/helloモジュールのgo.modファイルは次のようになるはずです。
module example.com/hello
go 1.20
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パッケージをインポートしたときに作成されました。
モジュールパスの後に続く数字は擬似バージョン番号で、意味的なバージョン番号(このモジュールにはまだありません)の代わりに使われる生成番号です。
helloディレクトリのコマンドプロンプトで、コードを実行し、動作を確認します。
go run .
次のように表示されるはずです。
% go run .
Hi, Gladys. Welcome!
解説
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)
}
以下に各行の解説を示します。
1行目: main
パッケージの宣言です。main
パッケージは、Goの実行可能なプログラムのエントリーポイントとして機能します。
3行目と4行目: fmt
パッケージと example.com/greetings
パッケージをインポートしています。fmt
パッケージは、フォーマットされたテキストの入出力を扱うために使用されます。example.com/greetings
パッケージは、挨拶メッセージを生成するためのカスタムパッケージです。このパッケージは、プログラムの同じディレクトリ内またはGOPATHにある必要があります。
6行目から9行目: main
関数の定義です。この関数は、プログラムのエントリーポイントとして機能します。
11行目: greetings.Hello("Gladys")
を呼び出して、Gladys
という名前の人に対する挨拶メッセージを取得します。greetings
パッケージの Hello
関数は、渡された名前を使用して挨拶メッセージを生成します。
12行目: 取得した挨拶メッセージを出力します。fmt.Println
関数を使用して、メッセージをコンソールに表示します。
このプログラムの実行結果は、Hi, Gladys. Welcome!
がコンソールに表示されます。
おわりに
今日は、Golangで作成した自作モジュールを利用する方法についてご紹介しました。
本記事で使用したコードは下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント