Golang Circular导入结构

时间:2018-02-20 11:37:19

标签: go circular-reference

我的代码很简单。

formatC(1560.65, format = "f", big.mark = ".", decimal.mark = ",")
[1] "1.560,6500"

我有一些口袋妖怪训练师,其定义如下:

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
    }

与往常一样,当我出错时,我会将其复制粘贴到Google上。我了解了什么是循环导入以及人们如何通过界面修复它以使用其他包中的方法而不导入它。但在我的情况下,问题不是使用方法,而是在另一个包中定义的真实类型。

所以你可能会说:"男人你是笨蛋!你只需把所有东西放在同一个包装上就可以了!#34; 对不起,我来自Java,我希望我的代码保持干净。 ;)

我看到这个link建议使用第三方套餐?但是你必须想象我不会只有口袋妖怪和pokeTrainer,我有更多的内置类型的包和很多方法..

你怎么看?如何正确修复此错误?我是Go的初学者

2 个答案:

答案 0 :(得分:5)

使用单个包,因此无需导入。

或者将您的某个套餐指定为" master",并将"所有内容"这两个包都需要这个" master",所以只有其他包需要导入" master"根据定义(" master"不需要导入另一个)。

或者你必须为两者所需的东西创建第3个包,而你的2个当前包只需要导入这个第3个通用包。

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

答案 1 :(得分:0)

我建议您使用Pokemon界面。也许你会添加几种类型的口袋妖怪,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
}

建议的另一个要点 - 使用结构指针而不是值。