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
}