import cycle not allowed (循環参照とは?)
他のpackageにimportしたときに、こんなエラーが出た人はいるんではないでしょうか?
import cycle not allowed
このエラーは循環参照が起きているときの吐かれるエラーです。
たとえばpackage aとbがあった場合に、
- package aでbの関数やメソッドを参照している
- package bでもaの関数やメソッドを参照している
と循環参照していることになり、import cycle not allowed
というエラーが出てしまいます。
循環参照が起こるコード例
循環参照が発生する具体的なコードを書いてみます。
ファイル構成
./app
├─ a/a.go
├─ b/b.go
├─ main.go
└─ go.mod
go.mod
module app
go 1.19
main.go
package main
import (
"app/a"
)
func main() {
a.CallB()
}
a.go
package a
import (
"fmt"
"app/b"
)
func PrintA() {
fmt.Println("A")
}
func CallB() {
b.PrintB()
}
b.go
package b
import (
"fmt"
"app/a"
)
func PrintB() {
fmt.Println("B")
}
func CallA() {
a.PrintA()
}
main.goを実行してみる
この状態でmain.go
を実行するとimport cycle not allowed
のエラーが出ます。
% go run main.go
package command-line-arguments
imports app/a
imports app/b
imports app/a: import cycle not allowed
循環参照の対策方法
循環参照が起きないようにするには主に下記の方法があるようです。
- ファイル構成を変更する
- interfaceを使う
- 同じpackageにまとめる
それぞれの具体的な実装例はまた別の記事で紹介しようと思います。
コメント