第一种方式:抽象出来一个接口层:
golang不允许循环import package ,如果检测到 import cycle ,会在编译时报错,通常import cycle是因为设计错误或包的规划问题。
以下面的例子为例,package a依赖package b,同事package b依赖package a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
package b:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
就会在编译时报错:
import cycle not allowed
package github.com/mantishK/dep/a
imports github.com/mantishK/dep/b
imports github.com/mantishK/dep/a
现在的问题就是:
A depends on B
B depends on A
那么如何避免?
引入package i, 引入interface
1 2 3 4 5 |
|
让package b import package i
1 2 3 4 5 6 7 8 9 10 11 12 |
|
引入package c
1 2 3 4 5 6 7 8 9 10 11 |
|
现在依赖关系如下:
A depends on B
B depends on I
C depends on A and B
第二种方式:建立一个组合子包
-
type CombileAB struct {
-
A *package_a.PackageA
-
B *package_b.PackageB
-
}
第三种方式:通过callback的方式回调,把函数通过参数传入
第四种方式:通过事件总线(eventBus)解耦
参考文章: