見出し画像

Goの外部/自作パッケージのimportについて

v1.11以降にGoにはGoPATHモードとmoduleモードがある。

v1.11以前の記事でGOPATHやGOROOTを変更したり、インポート時のエラーでこれらが問題である旨のエラーが出ることからはまることが多かったためまとめ。

本記事では公式が推奨している且つ利便性からmoduleモードでパッケージをimportします。

内部パッケージのインポート

まず前提として、moduleモードを使用するため、GOPATHもGOROOTも使用しません。任意の場所に作業ディレクトリを作成してください。

ディレクトリ構造は以下とします。

| /User/user/Documents/gotest/goproject
| sample
|   |- sample.go
| main.go

自作パッケージをimportする場合は、go.modの記載されるmodule名/{インポートするpackage名}で指定する

# main.go

package main

import "goproject/sample"

func main() {
   fmt.Print(sample.Example())
}
package sample
func Example() string {
	return "This is example."
}

modファイルを作成

goprojectで以下を実行すると、go.modファイルが作成され、カレンとディレクトリにgo.modファイルができた時点でmoduleモードとなります。

$ go mod init goproject

この時引数に与える名称はディレクトリ名と一致していることが推奨される。

modules disabled inside GOPATH... というエラーが出る場合の対策


Go 1.11 より新しいバージョンで GOPATH の中にソースコードを置くと次のようなエラーが出て go mod init に失敗することがあります。


go: modules disabled inside GOPATH/src by GO111MODULE=auto;


このエラーが出た場合は次のように GO111MODULE という環境変数を on にしてあ
げると直ります。

export GO111MODULE=on

go run main.goを実行すると以下のように自作パッケージが読み込まれていルことが確認できました。

go run main.go 
This is example.

moduleモードで外部パッケージをインポートする

今回はgoのフレームワークのginをインポートして動作確認する。

ディレクトリ構成は内部パッケージの時と同じ。

# main.go
package main
import (
	"net/http"
	"github.com/gin-gonic/gin"
)
func main() {
	engine := gin.Default()
	engine.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "hello world",
		})
	})
	engine.Run(":3000")
}

この時点では赤線で"github.com/gin-gonic/gin"の部分でエラーが出ています。moduleモードでは以下の手順で外部パッケージを読み込むことができます。

$ go mod init goproject
$ go mod tidy

上記コマンドを実行すると、go.modファイルとgo.sumファイルが作成されます。

localhost:3000にアクセスすると"hello world"が返ってきたので正常に動作しているようです。

補足:moduleモードの利点として今後ソースコードのインポートに外部バッケージが記載されたら自動でインストールして読み込んでくれるようになります。

この記事が気に入ったらサポートをしてみませんか?