Это проблема "круговой зависимости"
Программы Golang должны быть ацикличными. В Golang циклический импорт не разрешен (то есть его граф импорта не должен содержать никаких циклов)
Допустим, ваш проект "go-round-dependency" имеет 2 пакета "package one" и имеет "one.go" и "package two" и имеет "two.go". Итак, структура вашего проекта следующая
+--go-circular-dependency
+--one
+-one.go
+--two
+-two.go
Эта проблема возникает, когда вы пытаетесь сделать что-то вроде следующего.
Шаг 1. В «one.go» вы импортируете «второй пакет» (далее «one.go»)
package one
import (
"go-circular-dependency/two"
)
//AddOne is
func AddOne() int {
a := two.Multiplier()
return a + 1
}
Шаг 2 - В "two.go" вы импортируете "package one" (далее "two.go")
package two
import (
"fmt"
"go-circular-dependency/one"
)
//Multiplier is going to be used in package one
func Multiplier() int {
return 2
}
//Total is
func Total() {
//import AddOne from "package one"
x := one.AddOne()
fmt.Println(x)
}
На шаге 2 вы получите сообщение об ошибке «не удается загрузить пакет: цикл импорта не разрешен»
(это называется ошибкой «Циклическая зависимость» ).
С технической точки зрения это плохое дизайнерское решение, и вам следует избегать этого как можно чаще, но вы можете «нарушить циклические зависимости с помощью неявных интерфейсов» (я лично не рекомендую и очень не рекомендую эту практику, потому что по дизайну программы Go должны быть ацикличными. )
Старайтесь, чтобы ваша зависимость импорта была невысокой. Когда граф зависимостей становится глубже (т. Е. Пакет x импортирует y, y импортирует z, z импортирует x), круговые зависимости становятся более вероятными.
Иногда повторение кода - неплохая идея, что прямо противоположно DRY (не повторяйтесь)
Таким образом, на шаге 2, который находится в "two.go", вы не должны импортировать первый пакет. Вместо этого в «two.go» вы должны фактически воспроизвести функциональность «AddOne ()», написанную на «one.go» следующим образом.
package two
import (
"fmt"
)
//Multiplier is going to be used in package one
func Multiplier() int {
return 2
}
//Total is
func Total() {
// x := one.AddOne()
x := Multiplier() + 1
fmt.Println(x)
}
account
импорте пакета Вbase
пакете, который импортируетmux
пакет, который импортируетaccount
пакет. Это циклический набор зависимостей импорта, который недопустим. Похоже, у вас тоже есть другой цикл:base
импортmux
, какой импортroutes
, какой импортbase
.