Go项目推荐采用cmd/、internal/、pkg/、api/、configs/、scripts/等目录结构,按业务域组织包,配置与代码分离,测试文件与源码同目录,构建用Makefile统一管理。
Go 项目目录结构没有官方强制规范,但社区已形成成熟、可扩展的实践模式。关键在于按职责分离、避免循环依赖、便于测试和部署。
一个清晰的 Go 项目通常包含以下顶层目录:
cmd/myapp、cmd/myworker)configs/config.yaml、configs/config.local.yaml.example)
ke / golangci-lint 配置)go mod init example.com/myapp)避免按 controller/service/repository 这类 Java 风格分层。Go 更倾向按业务域或功能边界组织包:
internal/user(含 user.User 结构、注册/登录逻辑、密码加密等)internal/order(含 Order 结构、状态机、支付回调处理器)pkg/util(非业务通用函数,如时间格式化、JSON 辅助、错误包装)internal/storage 或 internal/repo(封装 SQL / ORM 调用,不暴露 driver 细节)每个包应有明确职责,go list ./... 应能直观反映依赖关系;内部包之间通过接口解耦(如 order.Service 依赖 user.Repository 接口,而非具体实现)。
立即学习“go语言免费学习笔记(深入)”;
不硬编码配置,也不把 config struct 放在 main 包里。推荐做法:
configs/config.go,使用 struct tag 标注 yaml/json keygithub.com/spf13/viper 或原生 gopkg.in/yaml.v3 + os.ReadFile 加载config.$ENV.yaml(如 config.prod.yaml),再 fallback 到 config.yaml
password: ${DB_PASSWORD})测试文件与源码同目录(user.go 与 user_test.go 并列),测试包名加 _test 后缀仅当需跨包测试时使用。
testify/assert 或原生 testing 即可internal/integration/,启动真实依赖(如 SQLite 内存 DB、mock HTTP server)Makefile 中:make build(编译所有 cmd)、make test(运行全部测试)、make lint(golangci-lint)不复杂但容易忽略