go命令找不到的根源是path未包含/usr/local/go/bin;需手动下载官方go包解压至/usr/local,配置path并重载shell;goproxy须设为https://goproxy.cn;生产环境用systemd管理服务,避免nohup或screen。

go 命令找不到?PATH 配置必须包含 /usr/local/go/bin
绝大多数“command not found: go”问题,根源就是 PATH 没生效或写错路径。别信系统包管理器装的 golang(Ubuntu/Debian 自带 go1.18,CentOS 默认更老),它装在 /usr/lib/go 或 /usr/bin/go,版本旧、升级难、还可能和你手动装的冲突。
正确做法是:
- 用
wget下载官方最新linux-amd64.tar.gz(ARM 服务器换linux-arm64.tar.gz),解压到/usr/local:sudo tar -C /usr/local -xzf go*.tar.gz - 编辑
~/.bashrc或~/.zshrc,只加这一行:export PATH=$PATH:/usr/local/go/bin - 执行
source ~/.bashrc(或对应 shell 配置),再运行echo $PATH确认输出里真有/usr/local/go/bin
别设 GOROOT —— Go 1.16+ 能自动推断;但如果你用 VSCode 或某些 CI 工具,显式写上 export GOROOT=/usr/local/go 更稳。
国内拉不到依赖?GOPROXY 必须设为 https://goproxy.cn
不配代理,go mod download、go build、go run 全部卡在 proxy.golang.org,超时失败。这不是网络问题,是默认行为。
执行这两条命令一次性搞定:
-
go env -w GO111MODULE=on(强制启用模块,Go 1.16+ 默认开,但显式设更防 CI 环境误关) -
go env -w GOPROXY=https://goproxy.cn,direct(direct表示私有仓库走直连,不影响内网 GitLab)
验证:go env GOPROXY 输出应含 goproxy.cn;go mod init test && go mod tidy 不报错即成功。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
服务怎么开机自启?用 systemd,别用 nohup 或 screen
nohup ./app > log & 只适合临时调试。生产环境要日志轮转、崩溃自动重启、依赖网络就绪、权限隔离 —— 这些 systemd 原生支持。
创建服务文件:sudo nano /etc/systemd/system/myapp.service,内容精简如下:
[Unit] Description=My Go Service After=network.target [Service] Type=simple User=deploy Group=deploy WorkingDirectory=/opt/myapp ExecStart=/opt/myapp/myapp Restart=always RestartSec=5 Environment=GIN_MODE=release StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
关键点:
-
User/Group别用root,建个专用用户(sudo useradd -m deploy) -
WorkingDirectory必须存在且可读,ExecStart路径要绝对(别用~/) -
Restart=always+RestartSec=5防止启动太快失败循环 - 启用:
sudo systemctl daemon-reload→sudo systemctl enable --now myapp
go build 出来的二进制,为什么一运行就退出?
常见原因不是代码 bug,而是服务没真正“守着端口”。比如:
- HTTP 服务忘了
http.ListenAndServe最后那个nil参数,或者传了http.DefaultServeMux但没注册路由 - main 函数末尾少了
select{}或time.Sleep(time.Hour),导致进程直接退出(适用于非 HTTP 的长任务) - 监听端口被占用(
:8080被其他进程占了),ListenAndServe返回 error 但没打印,程序静默退出
加一行日志最简单:log.Fatal(http.ListenAndServe(":8080", nil)) —— 错误会打到 stderr,systemd 日志里立刻能看到。
查日志用:sudo journalctl -u myapp -f,比翻文件快得多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










