基于Clean Architecture的Go项目架构实践

在过去的几年里,go语言已经在各个领域得到了广泛应用,从基础设施组件如k8s和docker,到业务领域的微服务,都可以使用go语言进行构建。在构建这些go项目时,选择哪种架构模式和代码布局是一个见仁见智的问题。有java spring经验的开发者可能会选择mvc模式,而有python flask经验的开发者可能会选择mtv模式。go语言领域尚未出现主流的企业级开发框架,许多项目甚至没有明确的架构模式。

Clean Architecture

基于Clean Architecture的Go项目架构实践Clean Architecture是Uncle Bob提出的适用于复杂业务系统的架构模式,其核心思想是将业务复杂度与技术复杂度解耦。与MVC、MTV等模式相比,Clean Architecture不仅进行分层,还通过依赖原则明确了与外部依赖的交互方式,以及外部依赖与业务逻辑的边界。感兴趣的朋友可以直接阅读作者原文:https://www.php.cn/link/95da0c581a96155640b7f98e422f9e44。

由于Clean Architecture具有脱离语言和框架的灵活性,作者在提出时也没有规定实现细节,这给Clean Architecture的实际应用带来了挑战。接下来,我们将通过一个例子来说明如何在Go项目中应用Clean Architecture的思想。

布局

无论采用哪种架构模式,建议在Go项目中建立app和scripts两个目录。app目录用于存放启动Go项目的入口文件,通常是main.go。而scripts目录可以放置构建和部署时使用的脚本。

代码语言:javascript代码运行次数:0运行复制“`javascriptclean_architecture_demo├── README.md├── app│ └── main.go├── scripts│ ├── build.sh│ └── run.sh├── go.mod├── go.sum└── usecases

接下来是代码部分,分为entities、usecases、adapters三个部分。
  • entities:存储领域实体。以博客系统为例,领域实体可能包括用户(user)和文章(article)。

  • usecases:存储业务逻辑。以博客系统为例,可能包括与用户相关的业务逻辑(signup_user、signin_user、add_user、delete_user)和与文章相关的业务逻辑(add_article、show_article、delete_article)。

  • adapters:存储适配器逻辑。适配器是连接业务逻辑与外部依赖的层。如果博客系统通过Web形式提供服务,就需要一个http_adapter来封装Web服务;同时,如果需要将文章保存到数据库,则需要封装一个db_adapter来连接数据库。

以下是项目的布局结构。

代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor">运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd">复制```javascriptclean_architecture_demo├── README.md├── adapters│ ├── api│ ├── db│ └── log├── app│ └── main.go├── scripts│ ├── build.sh│ └── run.sh├── entities│ ├── article.go│ └── user.go├── go.mod├── go.sum└── usecases

数据流向

以查询文章的请求为例,描述一下调用链路。

硅基智能 硅基智能

基于Web3.0的元宇宙,去中心化的互联网,高质量、沉浸式元宇宙直播平台,用数字化重新定义直播

硅基智能 62 查看详情 硅基智能

用户通过HTTP服务调用WebAdapter的ShowArticleHandler方法。

由于这是文章相关的逻辑,ShowArticleHandler会调用ArticleUsecase的ShowArticle方法。

需要从数据库中查询文章,ArticleUsecase会调用DBAdapter的GetArticle方法。

DBAdapter的GetArticle方法从MySQL中查询文章内容并返回给ArticleUsecase。

ArticleUsecase将结果返回给WebAdapter。

WebAdapter通过HTTP服务将结果返回给用户。

基于Clean Architecture的Go项目架构实践代码示例

为了更清晰地展示分层和架构,我在GitHub上发布了一个示例项目,感兴趣的朋友可以直接查看源码:https://www.php.cn/link/c1099cd51664559405dbb30d0f459df3

结论

由于Clean Architecture没有规定实现细节,因此上述的分层和布局方式只是一种参考,还有许多其他实践方式。例如,Adapter层可以根据外部依赖的类型细分为平行的Presenter+Gateway层。在复杂项目中,更细致的分层可以使代码更加细化。大家可以根据项目的规模来调整分层和布局,这里就不再赘述了。

以上就是基于Clean Architecture的Go项目架构实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/484270.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 12:40:03
下一篇 2025年11月8日 12:43:56

相关推荐

发表回复

登录后才能评论
关注微信