整理一波Go工程化目录结构~
在Go语言领域遨游了几个月后,发现自己对Go语言相关的工程目录结构有些不了解,按照原来的习惯在Go工程中建立的目录结构显得比较奇怪,好的目录结构绝对是可以加强工程效率的,所以接下来会参考煎鱼、毛大等大佬项目的结构做分析并且改造一个我的半成品项目。
每个项目的目录结构并不是有规定模板的,也有很多优秀的项目并不是常规的项目布局,还是要依据项目类型、大小及灵活程度做调整,但一定要保证结构清晰!
工程化目录
/pkg
一般来说作为外部应用程序可以使用的库代码,也即可以被其他项目引用的包。在pkg内部可以按照功能分类。所以说根目录下的pkg文件夹是作为整个项目的共享包库使用。
当然在非根目录的下也可以很好的加入pkg目录,很多项目会在internal目录下加入pkg表示内部共享包库。
/internal
大多数开源项目及官方代码等代码仓库中,我们总会在某个目录级别见到internal目录。它表示私有应用程序和库代码,也就是你不希望其他项目中导入的代码,一般存储一些比较专属于当前项目的代码包。这是在代码编译阶段就会被限制的,该目录下的代码不可被外部访问到。
internal目录并不局限在根目录,在各级子目录中也可以有internal子目录,也会同样起到作用。
/config
config目录或者configs目录顾名思义就是配置文件或者配置文件模板所在的文件夹。
/test
test目录经常用于存放整个应用的测试、测试数据及一些集成测试等,相较于单元测试在每个go文件对应的目录下,test目录偏向于整体,当然在某些子项目内也会有局部项目的测试会放在子项目的test中。
/docs
各类文档所在目录。
/third_party
可以放一些第三方的资源工具文件。
应用
以上就是一些常见的目录,还有一些/api、/example、/cmd等等也算是比较常见的目录,目录功能也显而易见。各种类型的项目的目录结构都不同,我这还是通过一个单体的应用的常用目录结构进行举例。

可以看到当前做到一半的项目,根目录下已经变得奇奇怪怪了,尤其是util文件夹里面放了各种东西(自己都看不下去了),接下来我们来做改造~
①我们将根目录结构调整一下

②我们需要将原来的util文件夹下的jwt组件、log日志组件、oss对象工具放到pkg文件夹中,并做好与本项目的解耦。
③将原来的util文件夹下的response和errmsg这些与当前项目强耦合的包放到internal中。
这样我们的根目录就变得十分清真,后续可以再加test、docs等等目录,也不会显得项目杂乱无章。最后我们来看看新的目录结构:

通过这篇随笔可以看出在go项目中有一些“潜规则”,比如刚入门的时候我们不知道各个项目中的internal和pkg文件夹表示肾么含义,当然还是那句话,项目的目录结构并没有一个强制性规范,我们应该不断看优秀的项目的结构目录,不断优化自己的架构意识,使得自己项目的扩展性加大的同时还能保证清晰。
代码是给人看的!
整理一波Go工程化目录结构~的更多相关文章
- Vue3(三)CND + ES6的import + 工程化的目录结构 = 啥?
突发奇想 这几天整理了一下vue的几种使用方式,对比之后发现有很多相似之处,那么是不是可以混合使用呢?比如这样: vue的全家桶和UI库,采用传统的方式加载(CND.script). 自己写的js代码 ...
- vue系列文章 --- 源码目录结构整理(三)
vue的版本是:^2.6.10 结构如下: |----- vue | |--- dist # 打包之后的目录vue文件 | | |--- vue.common.dev.js | | |--- vue. ...
- 浅谈android中的目录结构
之前在android游戏开发中就遇到本地数据存储的问题:一般情形之下就将动态数据写入SD中存储,在没有SD卡的手机上就需另作处理了;再有在开发android应用的过程中,总要去调试APP,安装时又想去 ...
- python基础之迭代器、装饰器、软件开发目录结构规范
生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大 ...
- 微信小程序购物商城系统开发系列-目录结构
上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的 ...
- epub电子书--目录结构介绍
epub电子书简介 epub全称为Electronic Publication的缩写,意为:电子出版, epub于2007年9月成为国际数位出版论坛(IDPF)的正式标准,以取代旧的开放Open eB ...
- express+gulp构建项目(一)项目目录结构
express是基于nodejs平台的web框架,它可以让我们快速开发出web引用.而gulp是一种自动构建工具,非常强大,有了它,能帮我们完成很多繁琐的工作,例如,静态文件的压缩,为静态文件加上哈希 ...
- linux目录结构详细介绍
目录1.树状目录结构图2./目录3./etc/目录4./usr/目录5./var/目录6./proc/目录7./dev/目录 该文章主要来自于网络进行整理.目录结构参考地址:http://www.hu ...
- sdk的目录结构及其功能
sdk的目录结构及其功能 add-ons: 这里面保存着附加库,比如GoogleMaps,当然你如果安装OphoneSDK,这里也会有一些类库在里面. build-tools: 各个版本的sdk编译工 ...
随机推荐
- 如何利用CRM系统打通营销全渠道?
企业经常通过不同渠道组织各种形式的营销推广,可惜,这些营销推广的效果往往差强人意. 相关研究表明,很多营销推广不理想的主要原因是不同营销渠道之间没有打通数据,不清楚每个营销渠道或营销策划的投入产出.推 ...
- 企业CRM系统选型的标准有哪些?
随着市场的发展,企业开始意识到客户的重要性.越来越多的企业形成了"以客户为核心"的理念,更加注重客户数据和管理,因此CRM客户关系管理系统成为企业的首选.选择一个适合企业的CRM系 ...
- Linux 如何查看系统负载
Linux 如何查看系统负载 310 博客 / Linux/ 4个月前/ 534 / 0 操作系统的负载状态,反映了应用程序的资源使用情况,从中能找出应用程序优化的瓶颈所在. 系统平均负载, ...
- 047.Python前端html
一 HTTP协议 1.1 HTTP请求 URL: 协议/IP:端口/路径?GET参数 基于请求响应 请求协议格式 GET URL路径?a=1&b=2 HTTP # 请求首行 user-age ...
- 6.1 tar:打包备份
tar命令 在Linux系统里,tar是将多个文件打包在一起,并且可以实现解压打包的文件的命令.是系统管理员最常用的命令之一,tar命令不但可以实现对多个文件进行打包,还可以对多个文件打包后进 ...
- SpringBoot + WebSocket 实现答题对战匹配机制
概要设计 类似竞技问答游戏:用户随机匹配一名对手,双方同时开始答题,直到双方都完成答题,对局结束.基本的逻辑就是这样,如果有其他需求,可以在其基础上进行扩展 明确了这一点,下面介绍开发思路.为每个用户 ...
- 备份分区,备份文件切割保存 dd
cd /tmp wget dl.fedoraproject.org/pub/epel/6/x86_64/dcfldd-1.3.4.1-4.el6.x86_64.rpm sudo yum install ...
- java并发编程工具类JUC第二篇:ArrayBlockingQueue
类ArrayBlockingQueue是BlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素.这里的"有界"是指存储容量存在上限,不能无限存储元素. ...
- Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化
前言 Windows上mingw32版本的openssl的编译是属于比较棘手的,OpenSSL本身不提供支持.. OpenSSL 介绍 OpenSSL是一个开放源代码的软件库包,应用程序可 ...
- MindInsight计算图可视设计
MindInsight计算图可视设计 特性背景 计算图可视的功能,主要协助开发者在下面这些场景中使用. 开发者在编写深度学习神经网络的代码时,可以使用计算图的功能查看神经网络中算子的数据流走向,以及模 ...