前言
-
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
-
-
-
