IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    golang不允许循环import问题(\"import cycle not allowed\")

    mckee发表于 2015-12-29 23:58:05
    love 0

    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



沪ICP备19023445号-2号
友情链接