问题
testing和unsafe不一样:unsafe所有的语义和实现都由编译器负责解释,本身只是作为占位符提供文档;testing虽然是用来测试其它package的,但是它本身并没有在编译器那里得到任何优待,只是普通的一个package,它自己也需要依赖其它package也需要测试。
testing支持的场景越复杂,引入的依赖就越多。譬如:bytes flag fmt io os reflect runtime sync等等还有很多。
那么问题来了:以bytes为例,既然testing依赖于bytes,那么bytes在测试时依赖testing不就import cycle了吗?
解决办法
export_test.go
: 测试不同 package 中的私有变量- XTest: 定义接口 -> 使用接口 -> 测试转发
接口
说起接口的作用,人们首先想起的总是那些八股文。
但是在这里,官方团队给我们上了生动的一课:接口在解决循环依赖中的巨大作用。
而且这种手法并不局限于context或者testing,它比第一种方案更具普适性(在测试这个特定场景下也更繁琐),完全可以在真实的世界里发挥巨大作用。