go run用于直接编译并运行Go源码文件,仅支持含package main和func main()的单文件或显式列出的多文件,不缓存临时二进制,适合开发调试。

go run 是最直接的用法,但“源代码怎么用”取决于你指哪类源码:是自己写的 .go 文件,还是想读/改 Go 标准库或编译器源码?两者完全不是一回事。
自己的 .go 源文件:别编译,先用 go run
刚写完一个 main.go,不需要生成二进制也能验证逻辑——go run 会自动编译并执行,且不留下可执行文件。
-
go run main.go:只运行单个文件,适合快速验证 -
go run .:运行当前目录下所有.go文件(要求只有一个main函数) -
go run *.go:显式列出所有源文件,避免意外包含测试文件(如xxx_test.go)
注意:go run 不会检查未使用的变量或导入(import),但 go build 会报错。所以调试阶段用 go run,上线前务必用 go build 过一遍。
标准库源码:用 go doc 和 go list 查,别硬翻目录
想搞懂 http.Client 怎么发请求?别直接去 $GOROOT/src/net/http/ 手动找——容易看错版本、漏掉构建约束(// +build)、绕过 go mod 的实际加载路径。
立即学习“go语言免费学习笔记(深入)”;
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
-
go doc fmt.Println:直接查函数签名和文档,内容来自源码注释 -
go doc -src net/http.Client.Do:显示该方法的原始实现(带行号) -
go list -f '{{.Dir}}' net/http:查这个包实际在磁盘哪,再用编辑器跳转
常见坑:本地装了多个 Go 版本,$GOROOT 指向旧版,但 go version 显示新版——此时 go doc 查到的可能是旧源码。用 go env GOROOT 确认路径。
下载并修改 Go 编译器源码:只建议调试 go 工具链本身
除非你在做 Go 语言开发(比如贡献 runtime 或 cmd/compile),否则**不要下载、编译 Go 源码来写业务程序**。你日常用的 go 命令就是编译好的二进制,跟你的项目无关。
- 下载地址是
https://go.dev/dl/,不是 GitHub 上的golang/go仓库(那是开发分支,不稳定) -
./all.bash是给 Go 开发者用的完整构建脚本,耗时长、依赖多、失败率高;普通用户只需go install第三方工具 - 改了
src/fmt/print.go并重新编译go,不会影响你go run main.go的行为——因为fmt包在构建你程序时已被静态链接进二进制
真正需要改标准库的情况极少:比如发现 time.Parse 在某个时区有 bug,且官方尚未修复,才考虑临时 patch 并用 go build -gcflags="-l" -ldflags="-s -w" 强制链接本地版本。
关键点就一句:你写的源码,用 go run 或 go build;你想看的源码,用 go doc 查;你不用也不该去编译 Go 自身源码来跑自己的程序。

















