很多人第一次在 Ubuntu 上使用 Go,真正卡住的往往不是写代码,而是安装路径、环境变量、编译输出和交叉编译这些基础环节。下面按“先装好、再跑通、再编译、最后优化和排错”的顺序整理一遍,读完后你可以判断自己该选官方二进制包还是 APT 安装,也能直接把程序编译到目标平台。
在 Ubuntu 上安装 Go 编译器
方式一:使用官方二进制包
如果你更看重版本可控和更新及时,优先用官方二进制包。原文示例使用的是 Go 1.20.5,安装步骤如下。

先更新系统包列表:
sudo apt update
下载 Go 安装包:
wget https://golang.org/dl/go1.20.5.linux-amd64.tar.gz
解压到 /usr/local:
sudo tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
然后编辑 ~/.bashrc 或 ~/.zshrc,加入以下环境变量:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
让配置立即生效:
source ~/.bashrc
最后执行 go version 检查结果。如果输出类似下面这样,说明安装已经成功:
go version go1.20.5 linux/amd64
方式二:使用 Ubuntu APT 仓库
如果你只是想快速装好、先跑起来,也可以直接使用 Ubuntu 自带仓库:
sudo apt install golang-go
这种方式的优点是简单,但仓库版本通常会比官方发布慢一些。安装后同样建议执行 go version 核对当前版本。
先写一个最小可运行的 Go 程序
安装完成后,先不要急着谈编译参数,最好先用一个最小示例确认开发环境确实可用。
按 Go 工作空间结构创建目录:
mkdir -p ~/go/src/hello
进入目录后,新建 main.go,写入以下内容:
package main
import "fmt"
func main() {
fmt.Println("Hello, Ubuntu & Golang!")
}
不经过正式编译,直接运行:
go run main.go
如果终端输出:
Hello, Ubuntu & Golang!
说明 Go 工具链、环境变量和当前目录结构都已经跑通。
如何在 Ubuntu 上编译 Go 程序
本地编译:生成当前系统可执行文件
在 main.go 所在目录执行 go build,就会生成当前平台可执行文件:

go build
默认输出文件名通常与目录或包名相关;原文示例中说明会生成名为 main 的可执行文件,Windows 下则会带上 .exe 后缀。
如果你想自己指定文件名,可以这样写:
go build -o hello
编译完成后直接执行:
./hello
输出应与 go run main.go 一致。
交叉编译:为目标平台提前生成可执行文件
Go 的一个明显优势,是可以直接为其他平台输出可执行文件。比如要生成适用于 Linux 64 位系统的程序,可以先设置目标平台,再执行构建:
export GOOS=linux
export GOARCH=amd64
go build -o hello-linux
生成的 hello-linux 可以直接放到对应 Linux 服务器运行,不需要在目标机器上再安装 Go 环境。
编译慢或文件大时,可以这样优化
利用编译缓存减少重复构建
Go 默认已经开启编译缓存,用来保存已编译的包,避免重复工作。原文提到也可以通过 -buildcache=true 显式启用,默认值就是开启状态。
用并行编译提升构建速度
如果机器核心数够用,可以通过 -p 指定并行编译数量。例如使用 4 个核心:
go build -p 4
这在项目依赖较多时更容易看到效果。
压缩二进制体积
如果更关心部署包大小,可以在构建时去掉调试信息和符号表:
go build -ldflags="-s -w" -o hello-small
按原文经验,这样通常可以减少 30%~50% 的体积,适合发布到服务器或分发场景。
依赖变化后强制全量重编译
当你怀疑缓存未更新,或者依赖刚刚发生变化,可以使用 -a 忽略缓存、重新编译所有包:
go build -a
常见问题与处理办法
出现 Permission denied 怎么办
如果编译后执行程序时提示 “Permission denied”,先给输出文件补可执行权限:

chmod +x hello
原文也提到可以直接用 sudo,但只建议在确有必要时再用。
依赖下载慢时如何设置代理
如果拉取模块很慢,可以配置 Go 模块代理:
go env -w GOPROXY=https://goproxy.cn,direct
这样通常能明显改善依赖下载速度。
交叉编译失败时先检查 CGO
交叉编译遇到错误时,一个常见原因是 CGO 依赖本地 C 库,导致跨平台时不兼容。可以先关闭 CGO 再试:
CGO_ENABLED=0 GOOS=linux go build
如果你的程序本身不依赖 C 扩展,这通常是最直接的处理办法。
怎么选安装和编译方式
如果你想要更新的版本和更稳定的管理方式,优先使用官方二进制包;如果只是临时体验或快速部署开发环境,APT 安装更省事。日常开发可以先用 go run 验证逻辑,再用 go build 输出可执行文件;需要发到服务器时,再结合 GOOS、GOARCH 和 CGO_ENABLED=0 处理交叉编译即可。









