go项目结构应按职责而非技术分层,以领域/功能划分主模块(如cmd/、internal/、pkg/),在internal下用“角色+契约”组织包内结构,集中管理配置、迁移与资源,并内置测试与工具链。

Go 项目结构没有官方强制标准,但清晰合理的模块划分和目录规范能显著提升可维护性、协作效率和可测试性。关键在于按职责而非技术分层,避免过度模仿其他语言(如 Java 的 controller/service/dao 套路),而是围绕业务域与稳定抽象来组织。
以领域/功能为边界划分主模块
将核心业务能力拆分为独立、高内聚的模块,每个模块对应一个子目录,通常作为 Go module(含 go.mod)或内部 package。例如:
-
cmd/:存放可执行程序入口,如
cmd/api、cmd/workers,每个子目录是一个独立 main 包 -
internal/:存放仅限本项目使用的私有逻辑,如
internal/user、internal/payment,体现明确的业务边界 - pkg/:存放可被外部引用的公共库代码(如有),需保证向后兼容,接口稳定
避免“技术分层”陷阱,用“角色+契约”组织包内结构
在 internal/user 这类模块中,不强制分出 handler、service、repository 目录。取而代之的是按角色定义清晰的接口,并让具体实现保持就近、轻量:
- 定义
user.Interface(如UserRepo、UserNotifier)放在internal/user/contract.go或直接在包根下 - 内存实现、DB 实现、HTTP handler 等,按需放在
internal/user/memory/、internal/user/pg/、internal/user/http/等子包中 - 所有子包都 import 主包(
user),而非反向依赖,确保抽象稳定、实现可插拔
配置、迁移与资源文件集中管理
配置不应散落在各模块中,统一由顶层驱动加载并注入:
Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的
立即学习“go语言免费学习笔记(深入)”;
-
config/:含
config.go定义结构体,load.go支持 YAML/TOML/环境变量多源合并 -
migrations/:数据库迁移脚本(如使用 golang-migrate),与
internal/db解耦 -
assets/ 或
embed/:静态资源(模板、SQL 文件等),用embed.FS打包进二进制
测试与工具链就位即用
测试是结构健康度的晴雨表,需从一开始就支持:
- 每个业务包(如
internal/user)自带user_test.go和集成测试子目录(如internal/user/integration/) - scripts/:存放一键构建、生成 mock(gomock)、格式化(gofmt)、检查(staticcheck)等常用命令
- 根目录放
.golangci.yml、Makefile或justfile,标准化本地开发流程
不复杂但容易忽略:目录名用小写、无下划线;每个包只做一件事;internal 下的包不导出非必要符号;go.mod 名应反映项目真实标识(如 github.com/yourorg/yourapp),而非 main。









