go mod 下载依赖失败怎么办
先查看环境:
1 | go env GOPROXY |
常用设置:
1 | go env -w GOPROXY=https://goproxy.cn,direct |
重新整理依赖:
1 | go mod tidy |
go.sum 冲突怎么办
go.sum 记录依赖校验信息,冲突时不要随便删整段。建议:
- 先合并
go.mod。 - 运行
go mod tidy。 - 检查
go.mod和go.sum的最终变化。 - 确认项目能正常测试和启动。
如何交叉编译
编译 Linux AMD64:
1 | GOOS=linux GOARCH=amd64 go build -o app |
编译 macOS ARM64:
1 | GOOS=darwin GOARCH=arm64 go build -o app |
编译 Windows:
1 | GOOS=windows GOARCH=amd64 go build -o app.exe |
如果项目依赖 CGO,交叉编译会复杂很多,需要额外配置 C 编译工具链。
panic 和 error 怎么区分
普通业务错误应该返回 error,例如参数错误、数据库错误、外部接口失败。
panic 适合不可恢复的程序错误,不应该用来做正常业务分支。
1 | if err != nil { |
goroutine 泄漏怎么排查
常见原因:
- channel 没有关闭。
- goroutine 一直阻塞等待。
- context 没有取消。
- 定时器或 ticker 没有停止。
- 请求结束后后台任务还在跑。
建议所有可能长期运行的任务都传入 context.Context:
1 | func worker(ctx context.Context) { |
map 并发读写报错怎么办
普通 map 不是并发安全的。并发读写时可以使用:
sync.RWMutex保护 map。sync.Map。- 通过 channel 串行化写入。
示例:
1 | var mu sync.RWMutex |
部署 Go 服务要注意什么
建议检查:
- 配置不要写死在代码里。
- 日志输出到文件或标准输出。
- 服务进程由 systemd、Docker 或进程管理工具托管。
- 健康检查接口可用。
- 监听地址和端口明确。
- 退出时能优雅关闭 HTTP 服务。
内存或 CPU 高怎么排查
可以启用 pprof:
1 | import _ "net/http/pprof" |
生产环境要加访问限制,不要直接暴露到公网。