gpt4 book ai didi

go - 修复 Go 中的导入周期

转载 作者:IT王子 更新时间:2023-10-29 01:53:59 31 4
gpt4 key购买 nike

所以我要解决这个导入周期。我有以下模式:

view/
- view.go
action/
- action.go
- register.go

一般的想法是 Action 在 View 上执行,并由 View 执行:

// 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,
}

然后在 view.go 中我们调用这个:

func (v *View) doThings() {
if action, exists := action.Register["ChangeName"]; exists {
action(v)
}
}

但这会造成循环,因为View依赖于Action包,反之亦然。我该如何解决这个周期?有没有不同的方法来解决这个问题?

最佳答案

导入周期表明设计存在根本性错误。从广义上讲,您正在查看以下内容之一:

  • 你在混淆问题。也许 view 根本不应该访问 action.Register,或者也许 action 不应该负责更改 View 的名称(或两个都)。这似乎是最有可能的。
  • 你依赖的是一个实体,而你应该依赖一个接口(interface)并注入(inject)一个实体。例如, View 不是直接访问 action.Register,而是可以在 view 中定义的接口(interface)类型上调用方法,然后注入(inject)到 View 构造时的对象。
  • 您需要一个或多个额外的、单独的包来保存 viewaction 包使用的逻辑,但它们都不调用任何一个。

一般来说,您希望构建一个应用程序以便拥有三种基本类型的包:

  1. 完全独立的包,不引用其他第一方包(它们当然可以引用标准库或其他第三方包)。
  2. 仅内部依赖性为上述类型 1 的逻辑包,即完全独立的包。这些包不应相互依赖或依赖于以下类型 3 的包。
  3. “接线”包,主要与逻辑包交互,处理实例化、初始化、配置和依赖项注入(inject)。这些可以依赖于除其他类型 3 包之外的任何其他包。您应该需要非常非常少的这种类型的包 - 通常只需要一个,main,但对于更复杂的应用程序,偶尔需要两三个。

关于go - 修复 Go 中的导入周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50986022/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com