golang中包循环依赖问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang中包循环依赖问题相关的知识,希望对你有一定的参考价值。

参考技术A 一、go中为什么不允许循环依赖
二、如何解决循环依赖
循环依赖就是A引用B,B又引用A,形成了一个包引用的闭环。要解决循环引用,就是打破这个闭环,让A引用B,B不能引用A。看下面的例子:

包结构如下:

执行main函数报错:

报错的原因是 我们在执行bagA.PrintA()的时候,引用了A包,A包又引用了B包,B包又引用了A包,形成了循环依赖。那我们打破依赖就可以了。

那么该怎么打破呢?

我们发现A包引用B包,是因为A包需要调用B包的bagB.GetName()方法;同样的,B包引用A包,是因为B包需要调用A包的bagA.GetName()方法。那么,我们有没有不需要引包就能使B包可以调用A包的方法呢?

当然是有的。看下面:

我们在B包里定义了一个方法变量AHandler,并且提供了为这个方法变量赋值的方法Register(),然后在A包里的init()方法里,调用B包的Register()方法,将A包的GetName方法复赋值给了AHandler变量。 这样,在B包执行方法AHandler是不是就相当于调用了A包的GetName方法呢?看执行结果:

总结:
上述解决办法的核心逻辑就是,B包使用一个方法变量来替代A中的方法(来完成B不引用A),A来为该变量赋值(因为A引用B,A可以调用B的方法来完成赋值)。 解决循环依赖问题,思想就是打破包的循环依赖,以不导包的方式调用其他包的方法。所以,采用接口的形式也可以解决循环依赖(B定义一个接口,A中你想要调用的方法实现了该接口,A中完成接口变量赋值,B来调用接口方法,有时间再补充例子吧)

Jest 单元测试中的 Angular 循环依赖问题

【中文标题】Jest 单元测试中的 Angular 循环依赖问题【英文标题】:Angular Circular Dependency issue in Jest unit tests 【发布时间】:2018-06-03 05:37:05 【问题描述】:

我有以下 Angular 组件。它们在我的应用程序中编译并运行良好。但是,当我在 Jest 测试中包含该模块时,会出现错误。我不知道这是否是 typescript 配置、Angular、Jest 或组合的问题。

组件:

@Component(
  selector: 'child-component',
  template: '<div>Child here.</div>'
)
export class ChildComponent 
  constructor( @Inject(forwardRef(() => ParentComponent)) private 
parentComponent: ParentComponent )  


@Component(
  selector: 'parent-component',
  template: '<div>
    <child-component></child-component>
    <child-component></child-component>
  </div>'
)
export class ParentComponent
  @ViewChildren(ChildComponent) _children: QueryList<ChildComponent>;


const EXPORTED_DECLARATIONS = [
  ChildComponent,
  ParentComponent
];

@NgModule(
  exports: [EXPORTED_DECLARATIONS],
  declarations: [EXPORTED_DECLARATIONS]
)
export class TestingModule  

如您所见,存在循环依赖。但是,它应该用@Inject(forwardRef(() =&gt; ParentComponent)) 修复,但这不起作用。

规格:

import  ComponentFixture, TestBed  from '@angular/core/testing';
import  TestingModule  from './test';
import  Component, forwardRef  from '@angular/core';

describe( 'TestComponent', () => 

  let component: TestTestComponent;
  let fixture: ComponentFixture<TestComponent>;

  beforeEach(() => 
    TestBed.configureTestingModule(
      declarations: [ TestComponent ],
      imports: [
        TestingModule
      ]
    );

    fixture = TestBed.createComponent(TestComponent);
    component = fixture.componentInstance;
   );

  it( 'default', () => 
    expect( fixture ).toMatchSnapshot();
  );

);

@Component(
  selector: 'test-test-1234',
  template: `<parent-component></parent-component>`
)
class TestComponent  

我在运行单元测试时收到以下错误。

ReferenceError: ParentComponent is not defined

我想补充一点,如果我对 Jasmine / Karma 执行相同操作,我不会收到此错误。

【问题讨论】:

【参考方案1】:

当我将这两个组件分成单独的文件时,问题就解决了。

【讨论】:

【参考方案2】:

尝试在你的测试中使用

 const el = fixture.debugElement.nativeElement;
 expect(el.outerHTML).toMatchSnapshot();

如果您将升级到最新版本的 angular(现在是 5.2.9),这些测试将耗尽内存!

【讨论】:

您好,我刚刚看到您对我的问题的回复。你提出了一个有趣的观点。我最近遇到了内存问题,并且测试需要很长时间才能运行。这可能是根本问题。但是,我已经进行了您建议的更改,但这会更改快照,因此它们的格式不正确。你有使用过这个和 jest-preset-angular 库的经验吗?谢谢你的帖子。

以上是关于golang中包循环依赖问题的主要内容,如果未能解决你的问题,请参考以下文章

C++20 模块“循环依赖”

Jest 单元测试中的 Angular 循环依赖问题

Go 包循环依赖如何分析 import cycle not allowed

Go 包循环依赖如何分析 import cycle not allowed

Spring的循环依赖问题

面试题:如何解决Spring 的循环依赖问题