在过去的几年里,go语言已经在各个领域得到了广泛应用,从基础设施组件如k8s和docker,到业务领域的微服务,都可以使用go语言进行构建。在构建这些go项目时,选择哪种架构模式和代码布局是一个见仁见智的问题。有java spring经验的开发者可能会选择mvc模式,而有python flask经验的开发者可能会选择mtv模式。go语言领域尚未出现主流的企业级开发框架,许多项目甚至没有明确的架构模式。
Clean Architecture
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运行复制```javascript clean_architecture_demo├── README.md├── app│ └── main.go├── scripts│ ├── build.sh│ └── run.sh├── go.mod├── go.sum└── usecases
<code> 接下来是代码部分,分为entities、usecases、adapters三个部分。 <ul><li><p>entities:存储领域实体。以博客系统为例,领域实体可能包括用户(user)和文章(article)。</p></li><li><p>usecases:存储业务逻辑。以博客系统为例,可能包括与用户相关的业务逻辑(signup_user、signin_user、add_user、delete_user)和与文章相关的业务逻辑(add_article、show_article、delete_article)。</p></li><li><p>adapters:存储适配器逻辑。适配器是连接业务逻辑与外部依赖的层。如果博客系统通过Web形式提供服务,就需要一个http_adapter来封装Web服务;同时,如果需要将文章保存到数据库,则需要封装一个db_adapter来连接数据库。</p></li></ul><p>以下是项目的布局结构。</p><p>代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> 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"></path></svg>运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="<a href="https://www.php.cn/link/c9041cfd2a40932691855abd98fd219a">http://www.w3.org/2000/svg"><path</a> 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"></path></svg>复制```javascript clean_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</code>
数据流向
以查询文章的请求为例,描述一下调用链路。
本系统是一个基于工厂模式的三层架构项目,基于VS2005 开发,结构简洁,配合动软Codematic代码生成器,可以使开发效率事半功倍,倍感轻松。本系统主要功能 1,物品类别管理 实现了物品类别的添加、修改、删除功能,方便库存物品分类管理。 2,物品管理 实现物品添加、修改,管理员可实时对物品做出库、入库记录,也可查看详细历史出入库记录。 3,商家管理 实现商家添加、修改、删除功能,方便公司和客户
0
用户通过HTTP服务调用WebAdapter的ShowArticleHandler方法。
由于这是文章相关的逻辑,ShowArticleHandler会调用ArticleUsecase的ShowArticle方法。
需要从数据库中查询文章,ArticleUsecase会调用DBAdapter的GetArticle方法。
DBAdapter的GetArticle方法从MySQL中查询文章内容并返回给ArticleUsecase。
ArticleUsecase将结果返回给WebAdapter。
WebAdapter通过HTTP服务将结果返回给用户。
代码示例
为了更清晰地展示分层和架构,我在GitHub上发布了一个示例项目,感兴趣的朋友可以直接查看源码:https://www.php.cn/link/c1099cd51664559405dbb30d0f459df3
结论
由于Clean Architecture没有规定实现细节,因此上述的分层和布局方式只是一种参考,还有许多其他实践方式。例如,Adapter层可以根据外部依赖的类型细分为平行的Presenter+Gateway层。在复杂项目中,更细致的分层可以使代码更加细化。大家可以根据项目的规模来调整分层和布局,这里就不再赘述了。
以上就是基于Clean Architecture的Go项目架构实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号