运行和编译Go代码

2025-09-30 18:14:00
丁国栋
原创 7
摘要:本文记录如何运行和编译Go代码。

在 Go 语言中,运行和编译代码主要有以下几种方式,适用于不同的开发场景:


1. 直接运行(go run

适用于快速测试单个文件或简单程序,要求无依赖

基本用法

go run main.go
  • 编译并立即运行 main.go,不生成可执行文件。
  • 适合开发调试阶段。

运行多个文件

如果程序分散在多个 .go 文件中:

go run main.go utils.go config.go
  • 必须列出所有依赖的文件,如果没有写全所有依赖的文件会提示 undefined 错误

运行整个包(当前目录)

go run .
  • 自动编译当前目录下所有 .go 文件(需属于同一个包)。
  • 这种方式一般比较常用,特别是在复杂项目中(项目中包含多个 .go 文件)。

2. 编译代码(go build

生成可执行文件,适合生产环境部署。


注:go build 会自动处理依赖,而 go run 不会自动处理依赖。

基本用法

go build -o myapp
  • 编译当前目录的 Go 代码,生成名为 myapp 的可执行文件。
  • 默认输出文件名与目录名相同(如目录是 project,则生成 project)。

编译指定文件

go build -o myapp main.go
  • 只编译 main.go 及其直接依赖。

跨平台编译

GOOS=linux GOARCH=amd64 go build -o myapp-linux  # 编译 Linux 版本
GOOS=windows go build -o myapp.exe              # 编译 Windows 版本
  • 通过 GOOSGOARCH 指定目标平台。

3. 安装到 $GOPATH/bingo install

将编译后的二进制文件安装到 $GOPATH/bin(或 $GOBIN):

go install
  • 需在包含 package main 的目录下执行。
  • 生成的可执行文件会保存在 $GOPATH/bin(可通过 which myapp 查看路径)。

4. 其他实用命令

清理编译缓存

go clean

查看编译详情

go build -x  # 显示详细编译过程

禁用优化和调试

go build -gcflags="-N -l"  # 禁用优化,便于调试

常见问题解决

Q1: go run 报错但 go build 正常?

  • 确保 go run 包含了所有依赖文件:

    go run *.go
  • 检查文件是否属于同一个包(如 package main)。

Q2: 编译后的文件太大?

  • 使用 -ldflags="-s -w" 移除调试信息:

    go build -ldflags="-s -w" -o myapp
  • 通过 upx 工具进一步压缩:

    upx --best myapp

Q3: 如何编译静态链接的二进制?

CGO_ENABLED=0 go build -a -o myapp
  • 禁用 CGO,生成无动态库依赖的二进制文件。

总结

场景 命令示例
快速运行 go run main.go
生成可执行文件 go build -o myapp
安装到全局路径 go install
跨平台编译 GOOS=linux GOARCH=arm64 go build
生产环境优化 CGO_ENABLED=0 go build -ldflags="-s -w"

根据需求选择合适的方式,开发阶段用 go run,部署用 go buildgo install

发表评论
博客分类