
go 构建工具会自动忽略所有以 `_test.go` 结尾的源文件,因其被约定为测试文件,仅由 `go test` 处理;若需编译运行,应重命名文件(如改为 `main.go` 或 `12.go`),避免使用 `_test` 后缀。
在 Go 语言中,文件命名并非完全自由——构建系统(go build、go run 等)遵循严格的约定规则。其中最关键的一条是:任何以 _test.go 结尾的 Go 源文件,都会被构建工具自动排除在外,无论其所在目录或包声明如何。
这是 Go 的设计规范,而非 bug。_test.go 文件专用于编写测试代码,必须满足以下条件才能被识别为测试文件:
- 文件名形如 xxx_test.go;
- 包声明通常为 package xxx_test(对被测包进行黑盒测试)或 package xxx(白盒测试,需在同一目录);
- 至少包含一个符合签名 func TestXxx(t *testing.T) 的测试函数。
因此,当你执行:
go build 12_test.go
Go 并不会尝试编译该文件,而是直接扫描当前目录下“可构建的源文件”(即非 _test.go、非 .*.go、非 vendor/ 中的合法 *.go 文件)。由于 12_test.go 被主动跳过,且目录中无其他 .go 文件,最终报错:
go build command-line-arguments: no buildable Go source files in D:\12
✅ 正确做法是:
- 若目标是运行主程序,请将文件重命名为 main.go(推荐)或 12.go,保持 package main 和 func main() 不变;
- 若目标是编写测试,则保留 _test.go 后缀,但需改用 go test 运行,并确保测试函数命名规范。
示例修正(推荐):
# 重命名文件 ren 12_test.go main.go # 再次构建(成功) go build # 或直接运行 go run main.go # 输出:Hello world
⚠️ 注意事项:
- 不要依赖 go build xxx.go 显式指定单个文件来绕过约定——Go 仍会先做文件可构建性检查;
- _test.go 文件中的 package main 和 func main() 不会被编译执行,即使语法正确;
- 类似地,以 .go 以外扩展名(如 .go.bak)、以 . 或 _ 开头的文件,也会被忽略。
总结:Go 的构建系统通过文件名约定实现关注点分离——xxx.go 用于生产代码,xxx_test.go 专用于测试。理解并遵守这一约定,是写出可维护、可测试 Go 项目的基础。










