`go run` 默认只编译指定文件,若项目由多个 `.go` 文件(如 `main.go` 和 `main2.go`)组成且同属 `main` 包,需显式列出所有源文件或使用通配符,才能正确解析跨文件的函数调用。
在 Go 中,main 包是可执行程序的入口,但 Go 的构建工具(如 go run)不会自动扫描目录下所有 .go 文件——这与 go test 的行为不同(后者默认加载同目录下所有非测试文件 + 测试文件)。因此,当你执

go run main.go
Go 仅编译并运行 main.go,而忽略同目录下的 main2.go,导致其中定义的 somefunc() 在 main.go 中被识别为未声明(undefined)。
✅ 正确做法是显式传入所有参与构建的源文件:
go run main.go main2.go
或者使用 shell 通配符(推荐用于小型项目,但需注意潜在风险):
go run *.go
⚠️ 注意事项:
? 最佳实践:对于多文件 main 包项目,建议统一使用 go run *.go(确保无测试文件),或维护一个简短的 Makefile / shell 脚本封装构建命令,提升可复现性与协作效率。