20210212关于测试时出现了两个AdaptersMap的指针问题 - ziyouzy/2021blog GitHub Wiki

我是从这篇文章所受的启发:
https://www.cnblogs.com/shengulong/p/10230644.html
请看这张图:

用户在“使用”import时需要遵循单向调用链模式,但是import自身的机制有些像是web服务端应用的request&response机制
最重要的两点需要明确:
1.import是在运行时最先进行的事件,通过单项调用链连锁至最末端
2.当所有的import结束后,最先压入内存的也是最末端的const,var, int, 函数代码块,然后是倒数第二,倒数第三...

这篇文章的问题就在于此,zadatper_test.go所在的包充当了主包的角色,虽然zadapter.go没有import heartbeating包(遵守了单项调用链模式),但是zadatper_test.go却引用了heartbeating包,这直接拖累整个包违反了单项调用链模式

同时,golang自身只有当两个.go文件被相互引用时才会检测到循环引用问题,因此现在的情况是其实已经存在了问题却没能被及时发现
于是才出现了这问题,解决方式是直接进行test包的设计,把这些代码都赋值过去

之后立刻发现了一个很有意思的事,请观察如下两者的区别:

package testpkg
import (
    "zadapter/define"
    "zadapter"
    "zadapter/heartbeating"//会报错,会被覆盖
)

package testpkg
import (
    "zadapter/define"
    "zadapter/heartbeating"//不会报错,不会覆盖
    "zadapter"
)

可以看到只需要简单的颠倒下顺序就能解决问题
其实还是会存在覆盖问题,只不过把错误的覆盖成了正确的
而之所以必须换到一个独立的包才能正常执行测试,是因为你没法选择自己决定这“细节上的先后顺序”
zadapter只能是这request&respones的最后一个环节,于是他也就是只能去覆盖别的包,而不能被别的包覆盖

其实存在三个问题: 1.包存在交叉引用,从而违背单项调用链模式 2.无法选择先后覆盖顺序 3.没在zadapter.go中存在问题,而是在zadapter_test.go中存在问题,于是编译器没能检测出问题

其实1和2是两个独立的问题,这里出错的根源是2
也没准交叉引用会存在一系列问题,比如让逻辑变得混乱,以及这种覆盖顺序问题等等,只不过这些问题被golang的设计者隐藏起来了
而3则是问题的具象化