Go 言語でパッケージを自作して、それを呼び出してみる - その2

はじめに

前回のエントリでは greetings というモジュール ( 正式名は genzouw/greetings モジュール) を作成しました。

今回のエントリでは、別のモジュール ( アプリケーション) から前回作成した greetings モジュール内にある Hello 関数を呼び出してみます。

ということで、もし前回のエントリ が見れていない場合は、一読することをお勧めします 。

コーディング開始!

それでは早速作成していきましょう。

1. ホームディレクトリ直下に hello というディレクトリを作成

1
2
3
4
5
$ cd

$ mkdir hello

$ cd hello

ディレクトリを作成した後は、前回作成した greetings ディレクトリと hello ディレクトリは同じ階層に並ぶはずです。

1
2
3
<home>/
 |-- greetings/
 |-- hello/

2. モジュールフォルダを作成したら、いつものように go mod init コマンドを実行

ここでもやはり、モジュール名は github のリポジトリ名をイメージして命名 しましょう。

1
2
$ go mod init genzouw/hello
go: creating new go.mod: module genzouw/hello

3. テキストエディタを開き、hello ディレクトリの中に hello.go というファイルを作成

もちろん好きなエディタで構いません 。

例

1
$ vi hello.go

4. Hello 関数の呼び出し、戻り値を標準出力に出力するソースコードをコーディング

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import (
	"fmt"

	"genzouw/greetings"
)

func main() {
	// Get a greeting message and print it.
	message := greetings.Hello("genzouw")
	fmt.Println(message)
}

ソースコードについて簡単に解説します。

  • Go 言語 では、実行可能なモジュール ( アプリケーションモジュール ) は main という名前のパッケージとします。
  • 2 つのパッケージをインポートしています。
    • fmt パッケージ
      • 中には入力情報と出力情報のテキストを色々な形に操作するための関数が含まれています。
    • genzouw/greetings パッケージ
      • 中にある Hello 関数を呼び出し、挨拶文を取得します。greetings モジュールは前回のエントリで作成したモジュールですね。

5. genzouw/hello モジュールの設定を変更

Go 言語のモジュールは、多くの場合 Github リポジトリに公開することを想定しています genzouw/hello モジュールを import した場合も、 Github リポジトリから genzouw/greetings モジュールを検索しようとします。

ただし、今回はちょっと状況が違います。 今回使用する genzouw/greetings モジュールは Github リポジトリ上で公開されているわけではありません。

作成したばかりでネット上に公開されていない genzouw/hello モジュールの置き場ば、自分の PC のファイルシステムです。 Github リポジトリにはなく、自分の PC 内にあることを何らかの形で教えてあげなければいけません。

これを行うために go mod edit コマンドを使います。 自分のローカル PC のファイルシステム内を探すように指定します 。

1
$ go mod edit -replace=genzouw/greetings=../greetings

このコマンドによって genzouw/greetings モジュールは ../greetings ディレクトリに置かれていて、そこから取得するようになります。 コマンド実行後に genzouw/hello モジュールディレクトリの go.mod ファイルの中身を見てみましょう。 replace という単語から始まる命令が追加されています 。

1
2
3
4
5
module genzouw/hello

go 1.16

replace genzouw/greetings => ../greetings

go.mod ファイルの設定変更が確認できたら 以前登場した go mod tidy というコマンドを実行します。 このコマンドを実行して初めて go.mod ファイルへの変更は意味を持ちます。

1
2
$ go mod tidy
go: found genzouw/greetings in genzouw/greetings v0.0.0-00010101000000-000000000000

コマンド実行後、 go.mod ファイルは以下のようになります。(一番下の行が追加されています。)

1
2
3
4
5
6
7
module genzouw/hello

go 1.16

replace genzouw/greetings => ../greetings

require genzouw/greetings v0.0.0-00010101000000-000000000000

go mod tidy コマンドを実行することで、 genzouw/greetings モジュールをローカル PC の ../greetings ディレクトリから探し見つかった結果として go.mod に一行追記しています。

モジュールのパスに続く謎の数値は、擬似的なバージョン値になっています。 genzouw/greetings モジュールが Github リポジトリから見つかった場合、タグの値などを使って以下のような行が追記されます。

1
require genzouw/greetings v1.1.0

ローカル PC 内のモジュールを利用する場合でも、 v1.1.0 に該当する記述が必要なので、go mod tidy 実行時にダミー値が設定される、という仕掛けのようです。

アプリケーション実行

それでは今回作成したアプリケーションモジュールを実行してみます。 こちらも何度も登場している、 main パッケージ内の main 関数を呼び出すためのコマンドです。 ( ファイル名を指定しても同じ結果になります。 )

1
2
$ go run .
Hi, genzouw. Welcome!

おめでとうございます!

これでついに、 「自作モジュールの作成」 と 「自作モジュールを利用するアプリケーションモジュール」 のコーディングができるようになりました。

ひとこと

次回は **エラーハンドリング ** について学習していきます!