前言
-
golang 不允许循环 import package, 如果检测 import cycle, 会在编译时报错,通常 import cycle 是因为错误或包的规划问题
-
以下面的例子为例,package a 依赖 package b,同时package b 依赖 package a
-
package a import ( "fmt" "github.com/mantishK/dep/b" ) type A struct { } func (a A) PrintA() { fmt.Println(a) } func NewA() *A { a := new(A) } func RequireB() { o := B.NewB() o.PrintB() }
-
packaga b:
-
package b import ( "fmt" "githunb.com/mantishK/dep/a" ) type B struct { } func (b B) PrintB() { fmt.Println(b) } func NewB() *B { b := new(B) return b } func RequirwA() { o := a.NewA() o.PrintA() }
-
就会编译报错:
-
import cycle not allowed package github.com.mantishK/dep/a import github.com/mantidK/dep/b imort github.com/mantishK/dep/a
-
现在的问题就是:
-
A depends on B B dependes on A
-
-
那么如何避免?
-
引入 package i,引入 intreface
-
package i type Aprinter interface { PrintA() }
-
让 package b Import package i
-
package b import ( "fmt" "github.com/mantishK/dep/i" ) func RequireA(o i.Aprinter) { o.PrintA() }
-
引入 package c
-
package c import ( "github.com/mantishK/dep/a" "github.com/mantishK/dep/b" ) func PrintC() { o := a.NewA() b.RequireA(o) }
-
现在依赖关系如下:
-
A depends on B B depends on I C depends on A and B
-
-
-