🎉

Goのimportで相対パスが使えなかった時の対処法

に公開

はじめに

相対パスによるimportをしようとしたら* is relative, but relative import paths are not supported in module modeというエラーが出てきました。

そこでどのようにすればエラーなくパッケージをimportできるのか調べてみることに。
その結果どうやら相対パスではなく、モジュールというものを使ってパスを書かなければいけないということで実際に試しました。
 

エラー発生時のファイル構成と記述

ファイル構成

foods
|-fruits
    |-apple.go
    |-banana.go
    |-grape.go
|-main.go
|-app.go
apple.go
package fruits

func VarietyOfApple() string {
	return "Fuji"
}
banana.go
package fruits

func VarietyOfBanana() string {
	return "Cavendish"
}
grape.go
package fruits

func VarietyOfGrape() string {
	return "Delaware"
}
app.go
package main

func AppName() string {
	return "Foods Application"
}
main.go
package main

import (
	"fmt"

	"./fruits"
)


func main() {
	fmt.Println(AppName())

	fmt.Println(fruits.VarietyOfApple())
	fmt.Println(fruits.VarietyOfBanana())
	fmt.Println(fruits.VarietyOfGrape())
}

main.goの"./animals"の部分で相対パスによりimportしようとしているのがおそらく原因です。
そこでfoodsディレクトリにモジュールを作成し、そのモジュールを使ってパスを書いてみました。
 

対応策

ターミナル
$ go mod init foods

を実行します。
そうすると以下のファイルが作成されました。これでfoodsディレクトリの中身がfoodsモジュールとしてコレクションされたといえると思います。

go.mod
module foods

go 1.24.2

次にmain.goのimport部分を修正します。

main.go
package main

import (
	"fmt"
    
+       "foods/fruits"
-       "./fruits"
)


func main() {
	fmt.Println(AppName())

	fmt.Println(fruits.VarietyOfApple())
	fmt.Println(fruits.VarietyOfBanana())
	fmt.Println(fruits.VarietyOfGrape())
}

この状態でmain.goとapp.goを実行してみましょう。

ターミナル
$ go run main.go app.go

Foods Application
Fuji
Cavendish
Delaware

うまく動かすことができました!

Discussion