必须匹配架构与发行版:uname -m为aarch64/arm64时需下载linux-arm64.tar.gz,而非amd64包;/etc/os-release确认发行版后,Alpine须源码编译,Ubuntu/CentOS等用官方tar.gz并正确配置GOROOT、PATH、GOPATH及GOPROXY。

确认云服务器架构与发行版是否匹配 Go 官方二进制包
直接在 ARM 实例(如 AWS Graviton、腾讯云 TKE ARM 节点)上下载 go1.22.5.linux-amd64.tar.gz,会导致 bash: /usr/local/go/bin/go: cannot execute binary file: Exec format error。这不是权限问题,而是 CPU 指令集不兼容。
- 用
uname -m查架构:输出x86_64→ 对应amd64;输出aarch64或arm64→ 选arm64包 - 用
cat /etc/os-release确认发行版:Ubuntu/CentOS/Debian 可直接用官方 tar.gz;Alpine 不支持 glibc,必须源码编译或换镜像 - 别用
apt install golang或yum install golang:Ubuntu 22.04 默认装的是 Go 1.18,缺go work和完整go mod支持,且路径常为/usr/lib/go,和$GOROOT探测逻辑冲突
解压后必须显式设置 GOROOT、PATH 和 GOPATH
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz 只是把文件放对位置,不配置环境变量,go 命令仍不可用,go install 生成的二进制也找不到。
- 在
~/.bashrc或/etc/profile.d/golang.sh中写死三行:export GOROOT=/usr/local/goexport GOPATH=$HOME/goexport PATH=$GOROOT/bin:$GOPATH/bin:$PATH -
PATH顺序很重要:必须把$GOROOT/bin放最前,否则系统可能优先调用旧版/usr/bin/go -
go env GOPATH输出应为$HOME/go,不是空值或/root/go(多用户时尤其注意)
国内网络下必须配 GOPROXY 和 GOSUMDB,否则 go mod 会卡死或校验失败
不设代理时,go mod download 默认连 proxy.golang.org 和 sum.golang.org,超时后重试 3 次才报错,看起来像“命令没反应”。更隐蔽的是校验失败:verifying github.com/gorilla/mux@v1.8.0: checksum mismatch,实际是校验服务器不可达导致本地缓存被跳过。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- 开发/测试环境可执行:
go env -w GOPROXY=https://mirrors.tuna.tsinghua.edu.cn/goproxy/,directgo env -w GOSUMDB=off - 生产环境禁用
GOSUMDB=off,改用可信代理链:go env -w GOPROXY=https://goproxy.cn,directgo env -w GOSUMDB=sum.golang.org(需确保代理能转发校验请求) - 私有仓库(如 GitLab 自建)要加
go env -w GOPRIVATE=git.internal.example.com,否则会被代理拦截
远程开发时别用 go run,构建和部署必须静态+systemd
go run main.go 在云服务器上跑一次就完事,进程没管理、日志不落盘、崩溃不重启,还容易残留临时编译产物。它只适合本地验证逻辑,不是部署手段。
立即学习“go语言免费学习笔记(深入)”;
- 构建静态二进制:
CGO_ENABLED=0 go build -a -ldflags '-s -w' -o myapp ./cmd/server
其中CGO_ENABLED=0确保无 libc 依赖,-s -w去符号表减体积 - 用 systemd 托管:
写/etc/systemd/system/myapp.service,指定User=www-data、Restart=always、StandardOutput=journal - 安全组只开业务端口(如
8080),关掉22的公网暴露——用跳板机或堡垒机 SSH,别让 root 直通公网
go env -w 写入的 $HOME/go/env 是纯文本,没有权限隔离;某人误执行 sudo go env -w GOROOT=/wrong/path,后续所有 su 切换用户都会继承这个错误值,且优先级高于 shell export,排查起来极难定位。

















