go 1.21+ 是微服务开发事实标准,需确认 go version ≥1.21.x、goproxy 已设且 go111module=on;模块路径须用反写域名如 example.com/user-svc;目录结构应含 cmd/internal/configs;docker 中注意 postgresql 密码、redis 绑定及跨平台 host.docker.internal 兼容性。

Go 1.21+ 是当前微服务开发的事实标准,低于这个版本会踩 module 校验、泛型支持、gRPC 兼容性等坑,别用系统包管理器装的旧版。
go version 和 GOPROXY 必须先确认再写代码
很多人跑 go mod init 失败,根本原因不是命令写错,而是 Go 版本太低或代理没开。执行前务必检查两件事:
- 运行
go version,输出必须是go version go1.21.x或更高;Ubuntu 自带的go1.18会卡在cannot find module providing package - 国内用户必须设代理:
go env -w GOPROXY=https://goproxy.cn,direct,否则go get或go mod download会超时或 403 - 别信 “默认已启用 module”,手动确认:
go env GO111MODULE输出应为on;若为auto,某些跨目录操作仍可能 fallback 到 GOPATH 模式
go mod init 的模块路径不能随便填
模块名不是项目文件夹名,也不是随便起个字符串。它本质是导入路径前缀,影响后续所有 import 语句和依赖解析:
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
- 推荐用公司/组织域名反写,例如
go mod init example.com/user-svc,避免和公共包冲突 - 千万别用本地路径如
go mod init ./user-svc或go mod init user-svc,会导致go list找不到包、CI 构建失败 - 初始化后立即检查
go.mod第一行:module example.com/user-svc—— 这就是你未来所有import的根路径
项目目录结构别从 main.go 开始建
微服务不是单体脚本,结构混乱会让配置加载、日志注入、测试覆盖迅速失控。初始化完 module 后,立刻按最小可行结构组织:
-
cmd/user-svc/main.go:只做初始化(viper加载配置、zap初始化日志、启动 HTTP/gRPC server),不放业务逻辑 -
internal/下分handler、service、repo,确保业务代码无法被外部 import -
configs/config.yaml和.env放根目录,但.env必须加进.gitignore,同时提供.env.example - 如果用
air热重载,记得在.air.toml里加include_ext = ["go", "env", "yaml"],否则改配置不触发重启
Docker Compose 启动依赖服务时端口和网络最常出错
本地联调时,PostgreSQL、Redis 容器连不上,90% 是网络或绑定地址问题,不是 Go 代码写错了:
- PostgreSQL 镜像必须显式设
POSTGRES_PASSWORD,否则日志只显示database system is shut down,实际是认证拒绝 - Redis 默认 bind
127.0.0.1,容器内访问不到,要用redis:alpine或加 command:redis-server --bind 0.0.0.0:6379 --protected-mode no - Go 服务容器里访问
host.docker.internal仅 macOS/Windows 有效;Linux 需额外加extra_hosts: ["host.docker.internal:host-gateway"] - 别把数据库端口直接映射到宿主机(如
"5432:5432"),容易和本地 PostgreSQL 冲突;用内部端口即可,Go 代码里连postgres://...@postgres:5432/...
真正麻烦的不是搭环境,而是环境搭好后,配置读不对、日志打不出、容器连不上——这些都不是语法错误,查起来要翻三四个地方。动手前先理清路径、网络、环境变量这三层关系,比反复重装 Go 有用得多。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










