六边形架构在Go中靠包结构与依赖方向保障,核心是domain层禁止导入任何infra类型(如database/sql、grpc),接口必须定义在domain/ports下,由adapter实现;wire注入须按infra→adapter→application顺序,确保依赖收敛。

六边形架构在Go里没有标准模板,但核心是分层隔离
GoLand 本身不内置六边形架构支持,它只提供 Go 语言的通用开发能力。真正决定你项目是否符合规范的,是你自己对包结构、依赖方向和接口定义的控制。关键不是 IDE 能不能“生成”六边形,而是你能不能让 core 层完全不 import 任何外部 SDK、框架或数据库驱动。
常见错误现象:core/domain.go 里出现 "database/sql" 或 "github.com/gorilla/mux" —— 这说明适配器已倒灌进领域层,架构就破了。
- 把业务逻辑(实体、规则、用例)全放在
core/或domain/下,且该目录下 不出现任何第三方 import - 所有对外部服务的依赖,必须通过接口声明在
core/内,实现则放在adapter/或infrastructure/ - GoLand 的「Go Modules」设置要确保
go.mod的replace或require不被误加到core/子模块里(Go 没子模块,但人为划分目录时容易误操作)
GoLand 中如何快速识别依赖违规
依赖方向错了,六边形就塌一半。GoLand 虽不能自动校验架构层级,但能帮你可视化和拦截。
使用场景:你在 core/usecase/user_create.go 里不小心 import 了 "github.com/go-sql-driver/mysql",GoLand 不会报错,但你可以立刻发现异常。
- 右键点击包名 → Diagrams → Show Diagram,选中
core包,观察箭头是否只指向内(无出向箭头) - 打开
Settings → Editor → Inspections → Go → Unused import开启,虽不直接检查架构,但能揪出冗余依赖,往往是违规入口 - 在
core/目录上右键 → Find Usages,查是否有adapter/类型被core/直接 new 或调用 —— 这属于实现细节泄露
接口定义位置和命名必须严格遵循“依赖倒置”
六边形架构里,core 层定义接口,adapter 层实现 —— 这条线不能模糊。GoLand 不强制你这么做,但能帮你维护一致性。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
参数差异:接口方法签名里的参数类型必须是 core 自己定义的 struct 或 interface,不能是 adapter/db.UserModel 这类实现层类型。
-
core/port/user_repository.go定义type UserRepository interface { Save(u *User) error },其中User必须定义在core/entity/user.go -
adapter/db/user_repo.go实现该接口时,内部可转换为db.UserModel,但对外绝不暴露 - GoLand 的 Refactor → Extract Interface 可以从具体实现快速反推接口,但注意:提取后务必把接口移回
core/port/,否则又绕回去了
测试时容易忽略的边界:端口实现必须可替换
写完 core 和 adapter,测试却总要连真实 DB?说明端口没真正解耦。GoLand 的测试运行配置本身不干预这个,但能帮你更快发现问题。
性能影响:如果 core/usecase 测试里硬编码了 new(adapter.PostgresUserRepo),那每次跑单元测试都走网络,既慢又不稳定。
- 所有测试应通过构造函数注入依赖,例如
u := NewUserCreator(&MockUserRepo{}),而不是在用例内部 new - GoLand 中右键测试函数 → Go to Test / Go to Production Code 可快速跳转验证是否用了 mock
- 检查
core/usecase/xxx_test.go是否 import 了adapter/...—— 如果有,说明测试污染了核心层
最常被忽略的一点:端口接口的 package 名不能叫 adapter 或 infra,必须叫 port 或 gateway,且路径在 core/ 下。名字错了,整个依赖方向就失去语义约束。

















