当前位置 博文首页 > 详解golang避免循环import问题(“import cycle not allowed”)

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

    作者:PHP点点通 时间:2021-07-02 17:48

    前言

    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

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对站长博客的支持。

    jsjbwy
    下一篇:没有了