はじめに
Goの勉強中、実行するとimportエラーでハマったのでその時に調べた内容を記録しました。
エラー内容
ターミナルでmain.goファイルのある階層まで移動し、以下のコマンドで実行する。
$ go run main.go
すると、以下のエラーが表示された。
main.go:5:2: package my_app/config is not in GOROOT (/usr/local/Cellar/go/1.16.5/libexec/src/my_app/config)
エラーが発生したときの状況
main.goファイルにconfigディレクトリ内のconfig.coファイルをimportしようとしたところでエラーが発生。
package main
import (
"fmt"
"my_app/config" //←ここの読み込みができずエラーが発生
)
func main() {
...
main.goファイルと、configディレクトリの位置関係
$GOPATH/src/my_app/main.go //main.goファイル
$GOPATH/src/my_app/config/config.go //configディレクトリとconfig.goファイル
(※ GOPATHの調べ方:https://kazuhira-r.hatenablog.com/entry/2021/01/03/222459 )
解決手順
importエラーが出ているmain.goファイルのモジュールファイルを作成する。main.goファイルがあるパスまでターミナルで移動し、以下のコマンドを実行する。(例として、今回はモジュール名をmainとして実行。)
$ go mod init [モジュール名]
$ go mod init main
go.modファイル(main.goのモジュールファイル)がmain.goファイルと同じ階層に作成される。
次に、エラーが起きていたmain.goファイルのimportの箇所を変更する。
package main
import (
"fmt"
"main/config" //←ここを変更
)
func main() {
...
ここでエラーが消えるはずなので、main.goファイルを実行し処理が通ればOK。
$ go run main.go
解説
Goを実行する際は「GOPATHモード」「モジュールモード」が存在し「.mod」のモジュールファイルがない場合は「GOPATHモード」と認識される。その結果、GOPATH内にimportで指定したファイルがない場合にエラーとなる。
importの変更は、「 (go.modに記載したモジュール名) + (go.modのある場所からのパッケージの相対パス)を探しに行く」ことを考慮して変更すること。(https://qiita.com/fetaro/items/31b02b940ce9ec579baf )
その他参考
・https://qiita.com/spiegel-im-spiegel/items/5cb1587cb55d6f6a34d7
・https://note.crohaco.net/2019/golang-package/