前言
先提出問題, 再說明原因. 有如下一段代碼:
當執行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
這個包作爲運行包比較特殊啦)
最後, 這個小問題寫出來其實沒多少東西, 但我在排查的時候還是稍微費了一些功夫的. 簡單看看就好