Go执行go test时同目录包名一致却报多包名错误,相关规则是什么?
Go 包名及测试文件相关核心规则
基础包规则
- 同一个目录下所有非测试类Go源码文件(文件名不以
_test.go结尾)的包声明必须完全一致,不允许存在多个不同包名。 - Go工具链不会强制要求普通源码文件的包名和所在目录名相同,但约定俗成会保持一致,避免使用时出现混淆。
go test 特殊处理规则
go test对以_test.go结尾的测试文件有单独的包名校验逻辑:
- 测试文件允许使用两种包名:
- 和同目录下普通源码文件的包名完全一致,属于同包测试,可以访问包内私有成员
- 使用
[原包名]_test格式的包名,属于黑盒测试,会被识别为独立的外部包,只能访问原包的导出成员
- 当测试文件使用后缀为
_test的包名时,Go工具链会自动将_test后缀去掉,推导得到被测试的原包名,然后在当前目录下校验是否存在对应包名的普通源码文件。
错误原因
你的目录名为view_test,目录下存在普通源码文件test.go(非测试文件)和测试文件main_test.go,两个文件都声明了package view_test:
- 扫描普通源码文件时,识别到
test.go的包名为view_test - 扫描测试文件时,识别到
main_test.go的包名view_test带_test后缀,自动推导被测试的原包名为view,在当前目录下找不到包名为view的普通源码文件,反而检测到包名为view_test的普通包,因此报出包冲突错误。
解决方案
- 如果
test.go是测试用文件:将test.go重命名为test_test.go,识别为测试文件后和main_test.go同属view_test测试包,不会触发普通包校验 - 如果
test.go是生产业务文件:将目录名修改为view,普通源码文件包名改为view,测试文件按需使用view(同包测试)或view_test(黑盒测试)作为包名 - 如果要保留现有目录名和
test.go命名:将测试文件的包名修改为不带_test后缀的名称,和普通源码文件包名保持一致,避免触发黑盒测试的包推导逻辑
内容的提问来源于stack exchange,提问作者abergmeier
相关产品推荐
相关产品推荐

