不忘初心,砥砺前行
作者 | 陌无崖
转载请联系授权
Go 项目最佳实践
Go应用程序应遵循的结构是一个有争议的主题。有些人坚持认为,每个人都应该对每个项目都遵循众所周知的golang-standards / project-layout结构。
但是,随着Go模块的引入成为处理依赖关系的标准,这种结构开始提出挑战。按照传统结构,您会发现结构中的某些文件夹无法访问内部或pkg之类的文件夹,并且您必须实施一些骇人听闻的解决方案才能使它们按原样工作。
在本文中,我将介绍在按新的世界顺序构建Go应用程序时可以选择的一系列选项。
小型应用-平面结构
每个项目都从小规模开始,并逐渐成长,这取决于它的成功程度或开发人员愿意为之贡献多少时间。
application/
- main.go
- main_test.go
- utils.go
- utils_test.go
- ...
强烈建议您在上述情况下从扁平文件夹结构入手。通过使项目的结构从一开始就简单易行,作为开发人员,您可以专注于尽可能快地向目标受众提供最高价值的功能,而不会产生复杂结构的认知开销。
我经常看到开发人员在交付任何真正有价值的东西之前,在项目的早期阶段花费更多的时间来安排和重新安排他们的代码库,并最终导致开发人员或开发人员团队之间的反馈循环更长。您的目标受众。
益处
这种扁平文件夹结构在开发时非常理想:
微服务-以分布式方式部署的微型应用程序,其构建目的是做一件事情,而只能做一件事情。
小型工具和库-专注于很好地完成少数任务的命令行工具或小型库。
这种结构的例子
让我们看一下此结构工作原理的一些示例:
tidwall / gjson-这个项目几乎完美地说明了一个令人难以置信的极简主义结构如何仍能成功完成项目的观点。他们从一开始就将所有内容保持在令人难以置信的平坦状态,并没有使事情变得过于复杂,同时专注于为使用该项目的人们提供真正的价值。
go-yaml / yaml-另一个非常酷的项目,具有完全平坦的项目结构。
中/大型应用程序-模块化
随着项目规模和复杂性的增长,您很快就会发现它开始超出平面结构,这是您应该开始考虑模块化代码库的时候了。
让我们以为网站提供动力的REST API为例。该REST API可能具有处理用户注册和登录的端点,以及另一个以类似CRUD的方式处理用户内容的组。
在这一点上,我们应该开始考虑将应用程序分解为功能性语义组,并可能将这些组件之间共享的所有核心逻辑集中到项目中的共享包中。
rest-api/
- main.go
- user/
- - user.go
- - login.go
- - registration.go
- articles/
- - articles.go
- utils/
- - common_utils.go
这种结构的例子
这里只是一些采用了这种结构的Go项目。
google / go-cloud-这是采用此结构的项目的一个很好的例子。他们已将项目分解为每个IAAS云提供商的程序包,并且每个程序包都包含与该特定云提供商有关的所有代码。
hashicorp / consul-这是选择采用模块化方法的大型项目的另一个很好的例子。
ipfs / go-ipfs-IPFS是用Go编写的非常酷的对等文件系统,它基于以前的系统(例如Git和BitTorrent)。同样,他们在开发系统时选择采用模块化方法。
gohugoio / hugo-非常好用的框架,目前已用作本网站的后端!
成熟的项目
您绝对会看到符合旧项目结构的项目,但这是这些应用程序开发时间的副产品。
诸如Hashicorp的Terraform或Google自己的Kubernetes之类的大型应用程序倾向于保留旧式结构的残留物,当$ GOPATH成为最高版本时,这种残留物效果很好。您会看到它们仍然具有内部和pkg文件夹,其中包含项目的某些内部工作。
这种结构运行得非常好,使开发人员能够为开发社区提供令人难以置信的价值,但是我认为,随着Go Modules开始变得越来越流行,我们将开始看到这些应用程序从更传统的结构迁移到传统结构。较新的结构。
拆分项目
在特定的一点之后,将项目的某些有意义的部分完全切入具有其生命周期的单独存储库中可能是有意义的。
这将具有其自身的一系列弊端,例如管理整个项目资产中的更新时增加的开销。但是,这也意味着您的项目对于想要贡献和帮助的项目新手来说将更容易消化。
结论
希望本文对您的开发工作有所帮助,并在您开始为下一个Go项目建模时给您一些想法!
这些是我自己的发现,基于我个人在日常工作中开发服务和服务经纪人的个人开发经验。使用这些结构时,您自己的里程可能会有所不同,但我很乐意在下面的评论部分中听到您对如何构建Go应用程序的想法和提示!
原文链接:https://tutorialedge.net/golang/go-project-structure-best-practices/
本文为Golang官方博客部分文章的外文翻译,官方案例更加有料哦
查看完整源码可以点击阅读原文进入github仓库,如果喜欢,感谢你为我点一个星星^_^
END
今日推荐阅读
RabbitMQ系列笔记广播模式和路由模式
RabbitMQ系列笔记入门篇
基于Nginx和Consul构建高可用及自动发现的Docker服务架构
▼关注我,一起成长
主要分享 学习心得、笔记、随笔▼