Go でローカルの他のモジュール内の関数を呼ぶ方法

ここでは、ローカルに作成した他の Go モジュール内にある関数を呼ぶ手順を説明します。

サンプルコードの内容とディレクトリ構成

今、下記のようなフォルダ構造で二つのモジュール example.com/animalexample.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")
}
example.com/animal/cat/cat.go
package duck

import "fmt"

func Hello() {
	fmt.Println("Quack")
}
example.com/animal/duck/duck.go
package main

import (
	"example.com/animal/cat"
	"example.com/animal/duck"
)

func main() {
	cat.Hello()
	duck.Hello()
}
example.com/app1/main.go

ここでやりたいことはモジュール example.com/app1 で、 モジュール example.com/animal 内の関数を呼ぶことです。

Go モジュールの作成

まず app1animal 両方に 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 モジュールの catduck パッケージ内の関数が呼び出されていることが確認できました。

以上、ここではローカルに作成した他のモジュールの内の関数を呼ぶ方法を説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Go 言語入門