Golang 循环导入结构

Golang Circular import structs

我的代码很简单。

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")

一如既往,当我遇到错误时,我将其复制粘贴到 google。我了解什么是循环导入以及人们如何使用接口修复它以使用来自另一个包的方法而不导入它。但就我而言,问题不在于使用方法,而在于另一个包中定义的真实类型。

所以你可能会说:"Man you are dumb ! You just have to put everything on the same package and it's fine !" 抱歉,我来自 Java,我希望我的代码保持整洁。 ;)

我看到这个 link 建议使用第三方包?但是你必须想象我不仅有 pokemon 和 pokeTrainer,我还有更多的包,里面有一个类型和很多方法..

你怎么看?我怎样才能正确地解决这个错误?我是围棋初学者

我建议你使用精灵宝可梦界面。也许你会添加几种类型的口袋妖怪,PokeTrainer 应该训练每一个。

示例:

poketrainer.go

package pokeTrainers

type IPokemon interface {
    train() error
}

type PokeTrainer struct {
   name        string
   pokemon    []IPokemon
}

pokemon.go

package pokemons

import "github.com/pokemonWorld/pokeTrainers"

type Pikachu struct {
   name   string
   sensei *PokeTrainer
}

func (o *Pikachu) train() error {
   // your code here
}

一个额外的建议 - 使用结构指针但不作为值。

要么使用单个包,那么不需要导入。

或者将您的一个包指定为 "master",然后将两个包都需要的 "everything" 放入此 "master",因此只需要导入另一个包"master" 根据定义(并且 "master" 不需要导入另一个)。

或者你必须为两者都需要的东西创建第三个包,而你当前的两个包只需要导入这个第三个公共包。

P.S。并且不要使用相对进口。始终使用完整的包路径。