Go でローカルの他のモジュール内の関数を呼ぶ方法
ここでは、ローカルに作成した他の Go モジュール内にある関数を呼ぶ手順を説明します。
サンプルコードの内容とディレクトリ構成
今、下記のようなフォルダ構造で二つのモジュール example.com/animal と example.com/app1 を作成することを考えます。
cd $GOPATH/src
tree .
.
└── example.com
├── animal
│ ├── cat
│ │ └── cat.go
│ └── duck
│ └── duck.go
└── app1
└── main.go
5 directories, 3 files
ひとつは example.com/animal モジュール内に cat パッケージと duck パッケージがあります。
もうひとつは example.com/app1 モジュールです。こちらの main 関数から cat パッケージや duck パッケージの中の関数を利用して、実行可能ファイルを作成します。
それぞれの *.go ファイルは次のようなファイルとします。
package cat
import "fmt"
func Hello() {
fmt.Println("Meow")
}
package duck
import "fmt"
func Hello() {
fmt.Println("Quack")
}
package main
import (
"example.com/animal/cat"
"example.com/animal/duck"
)
func main() {
cat.Hello()
duck.Hello()
}
ここでやりたいことはモジュール example.com/app1 で、 モジュール example.com/animal 内の関数を呼ぶことです。
Go モジュールの作成
まず app1、 animal 両方に go.mod を作成します。
cd $GOPATH/src/example.com/app1
go mod init example.com/app1
cd ../animal
go mod init example.com/animal
再度、ファイルの構成を確認すると確かに go.mod が作成されていることが確認できるはずです。
cd $GOPATH/src
tree .
.
└── example.com
├── animal
│ ├── cat
│ │ └── cat.go
│ ├── duck
│ │ └── duck.go
│ └── go.mod
└── app1
├── go.mod
└── main.go
5 directories, 5 files
Go モジュールのダウンロード元をローカルに変更
さて、上記の状況でもし、 app1 モジュールで example.com/animal の取得を試みるとどうなるでしょうか。
go get example.com/animal
go get: unrecognized import path "example.com/animal": reading https://example.com/animal?go-get=1: 404 Not Found
このように、 https://example.com/animal の読み取りを試みて、ファイル (モジュール) が存在しないためにエラーとなります。
ここでモジュールはローカルにあるので参照先を変更する必要があります。
example.com/animal の参照先をローカルに変更するために、次のコマンドで go.mod を更新します。
go mod edit -replace=example.com/animal=../animal
再度、モジュールの取得を試みます。
go get example.com/animal
go get: added example.com/animal v0.0.0-00010101000000-000000000000
今度は正しく取得できました。
Go の実行可能ファイルのビルドと実行
app1 モジュールをビルドします。
cd $GOPATH/src/example.com/app1
go build
これで実行可能ファイル app1 が作成されます。これは次のように実行可能です。
./app1
Meow
Quack
確かに example.com/animal モジュールの cat、 duck パッケージ内の関数が呼び出されていることが確認できました。
以上、ここではローカルに作成した他のモジュールの内の関数を呼ぶ方法を説明しました。