能跑通go run就算成功,只需Go 1.16+、两行代码(package main和func main())及一个hello.go文件;无需初始化模块、不依赖GOPATH、也不用配环境变量。
能直接 go run hello.go 成功输出,就算第一个 go 程序跑通了——不需要 go mod init、不依赖 gopath、也不用配环境变量,go 1.16+ 开箱即用。
package main 和 func main() 必须同时存在
Go 不看文件名,只认这两个东西:文件第一行必须是 package main(前面不能有空行或注释),且文件里必须定义 func main()。
-
package main写成package hello或漏掉 → 报错cannot run non-main package -
func main()写成Func Main()、main1()、带参数或返回值 → 编译失败,提示找不到入口函数 - 目录下有多个
.go文件,其中混了package utils→go run *.go会报multiple packages,得显式指定:go run main.go
fmt.Println 是最不容易出错的输出方式
别碰 fmt.Print 或 fmt.Printf 开头,它们要么不换行(光标卡住像“卡死”),要么格式动词写错就 panic。
-
fmt.Println("Hello")自动换行、自动处理类型、不校验占位符,适合所有初学场景 -
fmt.Print("Hello")不换行,终端看不到完整输出,容易误判程序没运行完 -
fmt.Printf("%s", 123)类型不匹配,运行时直接崩溃:panic: runtime error: invalid memory address - 导入了
"fmt"却没调用任何函数 → 编译拒绝:imported and not used: "fmt"
go run hello.go 的实际执行边界
go run 只扫当前目录下的 .go 文件,不递归子目录,也不识别路径为包名;它编译完立刻执行,临时文件不留痕。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 想运行
./cmd/hello/main.go?不能go run cmd/hello,得写全路径:go run cmd/hello/main.go - 如果
main.go依赖同目录的utils.go,必须一起列出来:go run cmd/hello/main.go cmd/hello/utils.go - Windows 下路径含中文或空格(如
我的第一个 Go 程序\main.go)→ 极大概率报no such file or directory,不是代码问题,是 shell 解析失败 - 执行完
go run main.go,别去当前目录找main.exe或main—— 它根本不会生成
真正容易被忽略的是模块上下文:虽然 Go 1.16+ 允许无 go.mod 运行单文件,但一旦报 go: cannot find main module,最轻量解法就是先在空目录下执行 go mod init tmp,再 go run main.go —— 不要硬扛错误信息,它和语法无关,只是模块系统在找“家”。
立即学习“go语言免费学习笔记(深入)”;

















