Go 1.16+默认启用模块模式,无需手动创建src/bin/pkg目录;唯一必需动作是go mod init example.com/myapp初始化模块,并设GOPROXY确保依赖拉取成功。

直接初始化 Go 语言环境,不需要手动建 src、bin、pkg 目录——Go 1.16+ 默认启用模块模式,这些目录已过时,硬建反而容易干扰依赖解析。
go mod init 是唯一必须的初始化动作
模块初始化不是可选项,而是编译和依赖管理的前提。没这步,go build 或 go run 会报 go: cannot find main module。
- 在空目录下执行:
go mod init example.com/myapp(模块名建议用域名前缀,避免和标准库或常见包冲突) - 模块名不能含大写字母或下划线,比如
my-app合法,MyApp或my_app会触发 go tool 报错 - 生成的
go.mod文件里会带go 1.x版本声明,务必检查是否匹配你本地的go version输出;不一致就立刻修正:go mod edit -go=1.22 - 别手动编辑
go.mod:格式错一个空格、多一行换行都可能导致go list解析失败
目录结构按用途建,不是按“惯例”堆砌
社区推荐的 cmd/internal/pkg 等目录,本质是为解决具体问题而存在,不是装饰性文件夹。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
cmd/:只放main包,每个子目录对应一个可执行文件(如cmd/api、cmd/cli),方便多命令项目构建 -
internal/:放业务逻辑,Go 编译器强制阻止外部模块 import 这里的包,适合封装核心服务层 -
pkg/:只放明确要被其他项目复用的代码,比如通用 HTTP 客户端、错误包装器;一旦放进来,就得考虑语义化版本和向后兼容 - 根目录下保留
main.go是反模式:它会让go build .和go build ./cmd/myapp行为不一致,新人容易混淆入口
验证环境是否真可用,别只靠 go run 成功
go run main.go 跑通 ≠ 环境就绪。很多问题在跨机器构建或 CI 场景才暴露。
立即学习“go语言免费学习笔记(深入)”;
- 运行
go list -m all:确认所有模块路径解析正确,没出现(replaced)或indirect异常标记 - 运行
go mod tidy后检查go.sum是否生成且非空——这个文件必须提交 Git,删了会导致别人go build失败 - 国内环境必须设
GOPROXY,否则go mod tidy卡住不动:go env -w GOPROXY=https://goproxy.cn,direct - 如果项目要用本地未发布的包(比如
internal/utils),import 路径必须完整,例如import "example.com/myapp/internal/utils",不能写相对路径
真正容易被忽略的是模块路径契约:一旦写进 go.mod,所有 import 语句、CI 构建脚本、甚至 IDE 的跳转逻辑,都绑定在这个字符串上。改名不是改一行的事,得同步改代码里所有 import、CI 配置、文档链接——所以初始化时花两分钟想清楚名字,比后期重构省三天。

















