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

はじめに

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

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

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

コーディング開始!

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

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

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

<home>/
 |-- greetings/
 |-- hello/
$ cd

$ mkdir hello

$ cd hello

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

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

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

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

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

$ vi hello.go

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

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 モジュールの設定を変更

自分の作業 PC の中にあるディレクトリの中のファイルを触ります。

自分で開発したモジュールは、多くの場合 Github リポジトリに公開することを想定しています
genzouw/hello モジュールを実行する場合も、 Github リポジトリから genzouw/greetings モジュールを検索しようとします

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

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

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

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

module genzouw/hello

go 1.16

replace genzouw/greetings => ../greetings

hello ディレクトリ内で go.mod ファイルに設定した内容に沿ってモジュールの登録を行ってみましょう。
こちらも以前登場したgo mod tidy というコマンドを実行します。
このコマンドを実行して初めて go.mod ファイルへの変更は意味を持ちます。

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

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

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 リポジトリから見つかった場合、タグの値などを使って以下のような行が追記されます。

require genzouw/greetings v1.1.0

ひとまずはローカル開発中だけの値と理解しておくことにしました。

アプリケーション実行

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

$ go run .
Hi, genzouw. Welcome!

おめでとうございます!

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

ひとこと

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

Posted by genzouw