go run 要求文件必须在 package main 包中且含 func main(),仅当前目录下 .go 文件有效,不递归子目录,不生成可执行文件,中文路径或空格需规避。

Go 程序必须放在 main 包里才能用 go run 运行
你写完 hello.go 却执行报错 no Go files in current directory 或直接静默退出?大概率是包声明不对。go run 只认 package main,且文件里必须有 func main()。其他包名(比如 package hello)会被忽略。
-
package main是硬性要求,不是约定;写成package main1或漏掉都不行 - 文件里不能只有
fmt.Println("Hello")而没包声明和main函数 - 如果项目里混了测试文件(
*_test.go),go run默认不执行它们,但会报错说“multiple packages”,这时得显式指定文件:go run main.go
go run 不能跨目录直接运行子文件夹里的 main.go
你在 ./cmd/hello/main.go 写好了程序,但在项目根目录下敲 go run cmd/hello 却提示 no buildable Go source files?因为 go run 默认只扫描当前目录下的 .go 文件,不递归子目录,也不自动识别子目录为包路径。
- 正确做法是进到那个目录再运行:
cd cmd/hello && go run main.go - 或者显式列出完整路径:
go run cmd/hello/main.go(注意不是cmd/hello/) - 如果子目录里有多个
.go文件(比如main.go+utils.go),必须一起列出来:go run cmd/hello/main.go cmd/hello/utils.go,否则可能报未定义引用
Windows 下中文路径或空格会导致 go run 找不到文件
你在桌面新建了个文件夹叫 我的第一个 Go 程序,里面放了 main.go,结果 go run main.go 报错 no such file or directory —— 很可能是路径编码或 shell 解析问题,尤其在 CMD 或旧版 PowerShell 中。
- 临时解法:把项目移到无中文、无空格的路径,比如
C:\gocode\hello - PowerShell 用户可尝试用引号包裹:
go run ".\我的第一个 Go 程序\main.go",但不保证 100% 成功 - 根本规避方式:从一开始就在终端用
mkdir hello && cd hello创建路径,避免手动拖拽或资源管理器建带空格/中文的文件夹
go run 编译后立刻执行,但不会生成可执行文件
你执行完 go run main.go 看到输出,顺手去当前目录找 main.exe(Windows)或 main(macOS/Linux),发现根本没有——这不是 bug,是设计如此。go run 的作用就是「编译 + 运行 + 清理临时产物」,它不保留二进制。
立即学习“go语言免费学习笔记(深入)”;
- 要生成可执行文件,改用
go build:go build -o hello main.go -
go run每次都重新编译,适合快速验证;go build适合交付或反复运行 - 注意:如果
main.go引用了本地相对路径的模块(比如import "./util"),go run会失败,因为 Go 1.11+ 默认启用 module 模式,应改用go mod init初始化后再导入










