go test main包報錯

前言

先提出問題, 再說明原因. 有如下一段代碼:

image-20230415221357951

當執行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?

經過我的測試, 有如下方法解決這個問題:

  1. 換個包名, 只要包名不是main就沒問題 (要帶着go.modmodule 一起改, 否則路徑找不到)
  2. 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包, 自然是不行的, 自己引入自己怎麼行呢.

這也就解釋了上面在測試時的解決方案爲什麼可行:

  1. 換包名: import _test "demo"
  2. 換路徑: import _test "main/demo"

只要換個名字或用路徑將2個包進行區分, 即可正確導入. (主要還是main這個包作爲運行包比較特殊啦)


最後, 這個小問題寫出來其實沒多少東西, 但我在排查的時候還是稍微費了一些功夫的. 簡單看看就好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章