【Go】 import cycle not allowed (循環参照)について

go エンジニア
記事内に広告が含まれています。

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にまとめる

それぞれの具体的な実装例はまた別の記事で紹介しようと思います。

コメント