10
5

More than 3 years have passed since last update.

Goの実行時にimportエラーでハマった話。

Last updated at Posted at 2021-09-06

はじめに

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しようとしたところでエラーが発生。

main.go
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の箇所を変更する。

main.go
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/

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5