Golang循环导入结构
我的代码很简单Golang循环导入结构,go,circular-reference,Go,Circular Reference,我的代码很简单 Project/ main.go pokemons/ pokemon.go pokeTrainers/ pokeTrainer.go 我有一些口袋妖怪训练器,定义如下: package pokeTrainers import "../pokemons" type PokeTrainer struct { name string pokemon []Pokemon } 还有一些口袋妖
Project/
main.go
pokemons/
pokemon.go
pokeTrainers/
pokeTrainer.go
我有一些口袋妖怪训练器,定义如下:
package pokeTrainers
import "../pokemons"
type PokeTrainer struct {
name string
pokemon []Pokemon
}
还有一些口袋妖怪:
package pokemons
import "../pokeTrainers"
type Pokemon struct {
name string
pokeTrainers PokeTrainer
}
主包装为:
package main
import (
"fmt"
"./pokemons"
"./pokeTrainers"
)
func main() {
fmt.Printf("ERROR CIRCULAR IMPORT")
和往常一样,当我有错误时,我会将其复制粘贴到谷歌上。我学习了什么是循环导入,以及人们如何使用接口修复它,以便在不导入的情况下使用另一个包中的方法。但在我的例子中,问题不是使用方法,而是使用另一个包中定义的实际类型
所以你可能会说:老兄,你真傻!你只要把所有东西都放在同一个包裹里就行了!
对不起,我来自Java,我希望我的代码保持干净
我看到这建议使用第三方软件包?但是你必须想象,我并不是只有口袋妖怪和pokeTrainer,我有更多的包,里面有一个类型和很多方法
你觉得怎么样?如何正确地修复此错误?我是Go的初学者我建议您使用口袋妖怪的界面。也许你会添加一个口袋妖怪和口袋妖怪应该训练每一个类型 例如: 口袋虫 口袋妖怪
建议的另一点-使用结构指针,但不要将其作为值。我建议您使用Pokemon的接口。也许你会添加一个口袋妖怪和口袋妖怪应该训练每一个类型 例如: 口袋虫 口袋妖怪
建议的另一点-使用结构指针,但不要将其作为值。或者使用单个包,因此不需要导入 或者将您的一个包指定为master,并将两个包中需要的所有内容都放到这个master中,因此根据定义,只有另一个包需要导入master,而master不需要导入另一个包 或者,您必须为这两个包中所需的内容创建第三个包,并且您当前的两个包只需导入第三个通用包 另外,不要使用相对进口。始终使用完整的包路径。或者使用单个包,因此不需要导入 或者将您的一个包指定为master,并将两个包中需要的所有内容都放到这个master中,因此根据定义,只有另一个包需要导入master,而master不需要导入另一个包 或者,您必须为这两个包中所需的内容创建第三个包,并且您当前的两个包只需导入第三个通用包
另外,不要使用相对进口。始终使用完整的包路径。相互依赖的类型属于同一个包。也不要使用相对导入路径。在Go中编程Java是没有帮助的。如果你想在围棋中做到这一点:在围棋中做到这一点,并停止游戏,但我想让它像Java一样。即使在Java中,循环依赖也是设计拙劣的标志。编译器并没有禁止它们,我猜Java之所以允许这样做是因为像protected这样的关键字会对包中的内容和不包含的内容产生影响。我认为,在Java中,完全基于每种语言的语义,为实现这一点而提出的相同论点对Go不起作用。相互依赖的类型属于同一个包。也不要使用相对导入路径。在Go中编程Java是没有帮助的。如果你想在围棋中做到这一点:在围棋中做到这一点,并停止游戏,但我想让它像Java一样。即使在Java中,循环依赖也是设计拙劣的标志。编译器并没有禁止它们,我猜Java之所以允许这样做是因为像protected这样的关键字会对包中的内容和不包含的内容产生影响。我不认为在Java中,完全基于每种语言的语义,可以为Go提供相同的参数。建议的另一点是使用结构指针,但不要将其作为值。是的,我会改变的!Thx的接口建议,但我的项目不是关于口袋妖怪,我没有很多类型的口袋妖怪:一个额外的建议点-使用结构指针,但不是作为一个值。是的,我会改变的!Thx的接口建议,但我的项目不是关于口袋妖怪,我没有很多类型的口袋妖怪:
package pokeTrainers
type IPokemon interface {
train() error
}
type PokeTrainer struct {
name string
pokemon []IPokemon
}
package pokemons
import "github.com/pokemonWorld/pokeTrainers"
type Pikachu struct {
name string
sensei *PokeTrainer
}
func (o *Pikachu) train() error {
// your code here
}