Go 项目最佳实践

作者 | 陌无崖

转载请联系授权

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官方博客部分文章的外文翻译,官方案例更加有料哦

本文分享自微信公众号 - golang技术杂文(gh_ebbdb61f463e),作者:无崖子天下无敌

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go HttpServer 最佳实践

    这是 Cloudflare 的 Filippo Valsorda 2006年发表在Gopher Academy的一篇文章, 虽然过去两年了,但是依然很有意义。

    李海彬
  • vue项目部署的最佳实践

    这两个问题可以从很多方面进行优化,今天我就从前端页面部署阶段来优化一下这两个问题。PS:以下内容都基于vue-cli3+。

    winty
  • 【项目实战-8】waf压测最佳实践

    压测机(运行Jmeter脚本)--> WAF --> CLB --> Node集群(Web)

    Nanako
  • 物联网项目六个最佳实践

    很多公司都在投资物联网(IoT),但很少有人觉得自己完全做好了准备。人们担心物联网的安全性、与其他技术的集成以及将物联网扩展到更广泛应用的能力。一些公司还质疑他...

    用户4122690
  • swagger 在 egg 项目中的最佳实践

    swagger 是一个 RESTful 接口的基于 YAML、JSON 语言的文档和代码在线自动生成工具,它让部署管理 API 变得前所未有的简单。swagge...

    CS逍遥剑仙
  • 【项目实战-1】NAT网关的最佳实践

    项目某后台接口QPS出现周期性的掉坑现象。每一次耗时的峰值,都对应一次QPS掉坑。

    Nanako
  • Github 项目推荐 | TensorFlow 项目模板架构最佳实践

    一个简单且设计良好的架构对于任何深度学习项目来讲非常有必要,这里的 Tensorflow 项目模板经过了大量的实践,拥有简单性、良好的文件结构以及 OOP 设计...

    AI研习社
  • InnoDB,5项最佳实践

    MySQL是目前互联网公司使用最广的数据库,InnoDB是MySQL使用最广的存储引擎,MyISAM和InnoDB的五项最佳实践,和大家聊聊,尽量多讲“为什么”...

    架构师之路
  • 新建NodeJS Web项目的几个最佳实践

    在项目建立初期引入一些最佳实践可以避免后期大量复杂的重构工作,本文总结了在使用Node JS构建Web服务时的一些最佳实践,同时涉及的具体的操作步骤。

    极客人
  • Python项目自动化部署最佳实践@搜狐

    今天主要介绍下我们组刚刚开源出来的一个自动化部署的工具 essay ,功能在readme上已经介绍的很详细了,这篇文章只是介绍下外围的情况,产生的环境,一些决策...

    the5fire
  • 基于 Lerna 管理 packages 的 Monorepo 项目最佳实践

    对于维护过多个package的同学来说,都会遇到一个选择题,这些package是放在一个仓库里维护还是放在多个仓库里单独维护,本文通过一个示例讲述了如何基于Le...

    杨振涛
  • Github 开源项目贡献指南:项目维护者的最佳实践

    维护一个项目需要的不仅仅是写代码的能力。有些时候会有一个你意想不到的的事情要应付,但是这对一个项目的成长也很重要(相对于代码来说),我们收集了一些小技巧来让你的...

    腾讯开源
  • Kotlin 项目开发最佳实践: Kotlin + Spring Boot + kts(Kotlin Script) 全栈统一前后端Kotlin 项目开发最佳实践: Kotlin + Spring

    Spring Boot + Kotlin type safe template rendering with i18n and nested template ...

    一个会写诗的程序员
  • 大道至简—GO语言最佳实践

    被称为GO语言之父的Rob Pike说,你是否同意GO语言,取决于你是认可少就是多,还是少就是少。

    腾讯技术工程官方号
  • 大道至简-GO语言最佳实践

    2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语...

    嘉为蓝鲸
  • ABAP system landscape和vue项目webpack构建的最佳实践

    基于Netweaver的ABAP transport route一般都有dev,test和prod三种类型的系统。

    Jerry Wang
  • ABAP system landscape和vue项目webpack构建的最佳实践

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • go最佳实践:go模拟spring的依赖注入

    使用过java的spring的依赖注入的朋友,一定会觉得由系统来实现单例并注入到要使用的地方,这个过程是极度舒适的。 博主从java转go后,在某些场景的项目...

    hugo_lei
  • Kafka 的 20 项最佳优化实践

    本文整理于网络翻译,英文原文:https://blog.newrelic.com/engineering/kafka-best-practices/

    大数据技术架构

扫码关注云+社区

领取腾讯云代金券