网络编程
位置:首页>> 网络编程>> Go语言>> 详解golang避免循环import问题(“import cycle not allowed”)

详解golang避免循环import问题(“import cycle not allowed”)

作者:PHP点点通  发布时间:2024-05-22 10:19:30 

标签:golang,循环,import

前言

golang不允许循环import package ,如果检测到 import cycle ,会在编译时报错,通常import cycle是因为设计错误或包的规划问题。

以下面的例子为例,package a依赖package b,同事package b依赖package a


package a

import (
"fmt"

"github.com/mantishK/dep/b"
)

type A struct {
}

func (a A) PrintA() {
fmt.Println(a)
}

func NewA() *A {
a := new(A)
return a
}

func RequireB() {
o := b.NewB()
o.PrintB()
}

package b:


package b

import (
"fmt"

"github.com/mantishK/dep/a"
)

type B struct {
}

func (b B) PrintB() {
fmt.Println(b)
}

func NewB() *B {
b := new(B)
return b
}

func RequireA() {
o := a.NewA()
o.PrintA()
}

就会在编译时报错:

import cycle not allowed
package github.com/mantishK/dep/a
  imports github.com/mantishK/dep/b
  imports github.com/mantishK/dep/a

现在的问题就是:

A depends on B
B depends on A

那么如何避免?

引入package i, 引入interface


package i

type Aprinter interface {
PrintA()
}

让package b import package i


package b

import (
"fmt"

"github.com/mantishK/dep/i"
)

func RequireA(o i.Aprinter) {
o.PrintA()
}

引入package c


package c

import (
"github.com/mantishK/dep/a"
"github.com/mantishK/dep/b"
)

func PrintC() {
o := a.NewA()
b.RequireA(o)
}

现在依赖关系如下:

A depends on B
B depends on I
C depends on A and B

来源:http://ju.outofmemory.cn/entry/230115

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com