我有一个中央包,提供其他包依赖的几个接口(让我们调用一个Client).那些其他包提供了那些第一个接口(UDPClient,TCPClient)的几个实现.我Client通过调用NewClient中央包来实例化,并从一个依赖包中选择并调用相应的客户端实现.
当我想告诉中央包关于那些其他包时,它就会崩溃,所以它知道它可以创建什么客户端.这些依赖的客户端实现也导入中央包,创建Go不允许的循环依赖.
前进的最佳方式是什么?我不想将所有这些实现混合在一个包中,并且创建一个单独的注册表包似乎有点过分.目前,我将每个实现注册本身与中央包一起注册,但这要求用户知道在每个使用客户端的单独二进制文件中导入每个实现.
import (
_ udpclient
_ tcpclient
client
)
Run Code Online (Sandbox Code Playgroud) 我的代码很简单.
Project/
main.go
pokemons/
pokemon.go
pokeTrainers/
pokeTrainer.go
Run Code Online (Sandbox Code Playgroud)
我有一些口袋妖怪训练师,定义如下:
package pokeTrainers
import "../pokemons"
type PokeTrainer struct {
name string
pokemon []Pokemon
}
Run Code Online (Sandbox Code Playgroud)
还有一些口袋妖怪:
package pokemons
import "../pokeTrainers"
type Pokemon struct {
name string
pokeTrainers PokeTrainer
}
Run Code Online (Sandbox Code Playgroud)
主要包装是:
package main
import (
"fmt"
"./pokemons"
"./pokeTrainers"
)
func main() {
fmt.Printf("ERROR CIRCULAR IMPORT")
Run Code Online (Sandbox Code Playgroud)
一如既往我有错误,我将其复制粘贴到谷歌上.我知道什么是循环导入以及人们如何通过接口来修复它以使用来自另一个包的方法而无需导入它.但在我的情况下,问题不是使用方法,而是在另一个包中定义的真实类型.
所以你可能会说:"你是个笨蛋!你只需把所有东西放在同一个包装上就可以了!" 对不起,我来自Java,我希望我的代码保持干净.;)
我看到这个链接建议使用第三方软件包?但是你必须想象我没有pokemon和pokeTrainer,我有更多的包里面有一个类型和很多方法..
你怎么看 ?如何正确修复此错误?我是Go的初学者