flo*_*bit 2 dependencies circular-dependency go
所以我要解决这个导入周期。我有以下模式:
view/
- view.go
action/
- action.go
- register.go
Run Code Online (Sandbox Code Playgroud)
总体思路是,操作是在视图上执行的,并由视图执行:
// view.go
type View struct {
Name string
}
// action.go
func ChangeName(v *view.View) {
v.Name = "new name"
}
// register.go
const Register = map[string]func(v *view.View) {
"ChangeName": ChangeName,
}
Run Code Online (Sandbox Code Playgroud)
然后在view.go中调用它:
func (v *View) doThings() {
if action, exists := action.Register["ChangeName"]; exists {
action(v)
}
}
Run Code Online (Sandbox Code Playgroud)
但这会导致一个周期,因为View依赖于Action包,反之亦然。我该如何解决这个周期?有其他方法可以解决此问题吗?
导入周期表明设计存在根本错误。从广义上讲,您正在查看以下内容之一:
view根本不应该访问action.Register,或者action不应该负责更改视图名称(或两者)。这似乎是最有可能的。action.Register直接访问视图,而是可以在中定义的接口类型上调用方法view,并View在构造对象时将其注入到对象中。view和action程序包都使用的逻辑,但两者都不调用。一般而言,您希望设计一个应用程序,以便拥有三种基本类型的软件包:
main,但对于更复杂的应用程序则偶尔需要两个或三个。| 归档时间: |
|
| 查看次数: |
2986 次 |
| 最近记录: |