go test main包报错
前言
先提出问题, 再说明原因. 有如下一段代码:
当执行go test
测试时, 会报如下错误:
main.test
/var/folders/55/47pl3jxx6rg7m0r6xvn4f7wr0000gn/T/go-build2769402238/b001/_testmain.go:13:8: could not import main (cannot import "main")
FAIL main [build failed]
什么意思? 导入main
包失败? Why?
经过我的测试, 有如下方法解决这个问题:
- 换个包名, 只要包名不是
main
就没问题 (要带着go.mod
的module
一起改, 否则路径找不到) - 将
demo.go
文件放到子目录下. 只要文件不在根目录就没问题
综上, 只有对根目录的main
包方法执行test
时会报错.
探究
为什么会发生这样的事情呢? 为了了解原因, 执行go test -work
命令可以在执行后保留生成的_testmain.go
文件.
这个生成的测试文件开头几行是这样的:
// Code generated by 'go test'. DO NOT EDIT.
package main
import (
"os"
"testing"
"testing/internal/testdeps"
_test "main"
)
而根据报错信息, 是因为_test "main"
这行导致的报错. 这又是什么原因呢?
相信聪明的你一眼就看出原因了, 这个生成的test
文件, 包名就是main
(因为Go
的可执行文件必须是main
包), 而在main
包中引入main
包, 自然是不行的, 自己引入自己怎么行呢.
这也就解释了上面在测试时的解决方案为什么可行:
- 换包名:
import _test "demo"
- 换路径:
import _test "main/demo"
只要换个名字或用路径将2个包进行区分, 即可正确导入. (主要还是main
这个包作为运行包比较特殊啦)
最后, 这个小问题写出来其实没多少东西, 但我在排查的时候还是稍微费了一些功夫的. 简单看看就好