在多年的 Go 语言实践积累后逐渐形成了一种典型项目结构,如下图所示:

上面就是一个支持构建二进制可执行文件(在 src 下)的典型 Go 项目的结构。

1 src 目录:

存放项目要编译构建的可执行文件对应的 main 包的源文件。如果有多个可执行文件需要构建,每个可执行文件的 main 包单独放在一个子目录中,比如图中的 appA、appB;src 目录下的各 app 的 main 包将整个项目的依赖连接在一起。我们在 main 包中会做一些命令行参数解析、资源初始化、日志设施初始化、数据库连接初始化等工作,然后会将程序的执行权交给更高级的执行对象。

2 pkg 目录:

存放项目自身要使用、同样也是可执行文件对应 main 包所要依赖的库文件;还可以被外部项目引用。

3 Makefile:

这里的 Makefile 是项目构建工具所用的脚本。Go 并没有内置如 make 等级别的项目构建工具,对于规模较大的项目而言,工具是不可缺少的。在 Go 典型项目中,项目构建工具的脚本一般放在项目顶层目录下,如上面的 Makefile;如果脚本较多的项目,也可以建立 build 目录。

4 go.mod 和 go.sum:

Go 语言包依赖管理使用的配置文件。Go 1.11 版本引入 go modules 机制,因此新项目建议基于 go modules 进行包依赖管理。

5 vendor 目录(可选):

vendor 是 Go 1.5 版本引入的用于在项目本地缓存特定版本依赖包的机制,在 go modules 机制引入前,go modules 本身就可以实现构建,而无需 vendor,因此这里将 vendor 目录是一个可选目录。

Go 语言典型项目结构(构建库类型)

Go 1.4 发布时,Go 语言项目自身去掉了 src 下的 pkg 这一层目录,这个结构上的改变对那些只编译为库的 Go 语言库类型项目结构有着一定的影响。我们来看一个典型的 Go 语言库类型项目的结构布局:

我们看到库类型项目相比于构建二进制可执行文件的项目要简单一些:

去除了 src 和 pkg 两个子目录;

库项目仅通过 go.mod(或其他包依赖管理工具的 manifest 文件)明确表述出该项目依赖的模块或包以及版本要求即可。

参考: https://mp.weixin.qq.com/s/vd6rz5BAR5gngZsuQ9LOYA

Go 语言设计哲学之四:项目布局-你如何设计项目结构的更多相关文章

  1. 小程序UI设计(7)-布局分解-左-上下结构

    FlexBox布局中的变幻方式很多,我们继续了解一个左-上下结构的布局分解  左边结构树中WViewRow下面有两个WViewColumn.WViewRow是横向排列,WViewColumn是纵向排列 ...

  2. 理解numpy中ndarray的内存布局和设计哲学

    目录 ndarray是什么 ndarray的设计哲学 ndarray的内存布局 为什么可以这样设计 小结 参考 博客:博客园 | CSDN | blog 本文的主要目的在于理解numpy.ndarra ...

  3. React的设计哲学 - 简单之美

    React最初来自Facebook内部的广告系统项目,项目实施过程中前端开发遇到了巨大挑战,代码变得越来越臃肿且混乱不堪,难以维护.于是痛定思痛,他们决定抛开很多所谓的“最佳实践”,重新思考前端界面的 ...

  4. Spring History和spring设计哲学

    1.spring history spring起点 2002年10月,Rod Johnson 写了一本名为Expert One-on-One J2EE设计和开发的书.本书由Wrox发布,涵盖了当时Ja ...

  5. 进击的 Ansible(二):如何快速搞定生产环境 Ansible 项目布局?

    Tips:与前文 <进击的 Ansible(一):Ansible 快速入门> 一样,本文使用的 Ansible 版本 2.5.4,项目演示环境 MacOS.由于 Ansible 项目开发活 ...

  6. 【一月一本技术书】-【Go语言设计与实现】- 9月

    Go : 2009.11.10 代表作:Docker.k8s.etcd 模仿C语言,目标:互联网的C语言 讲的晦涩难懂....硬板..放弃了好几次才读完.满分10分,打6分. 下个月:Python数据 ...

  7. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  8. Python的设计哲学探究

    在Python shell中输入import this就会在屏幕上打印出来Python的设计哲学,如下: In [25]: import this The Zen of Python, by Tim ...

  9. go项目布局(摘录)

    go的项目结构布局 或 包结构布局 这一块大家似乎还在摸索吧, 常用的应该还是类似于java的mvc布局, 但网上也有不同的布局方式,查阅github上的一些源码,也有大量的采用. 我把自己碰到的资料 ...

随机推荐

  1. charles详解

    Charles抓包https:https://www.jianshu.com/p/ec0a38d9a8cf 浅谈charles抓取https原理:https://www.jianshu.com/p/4 ...

  2. C语言必踩神坑,世上本没有坑,摔的人多了,也就有了坑!

    这是一个伤心的故事,有多少小伙伴在写C语言代码时遇到过的情景! 提问:C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关: 可能但不保证初始化为0: 未确定. 总之,全部都是些一本正 ...

  3. 经验分享:Windows10值得推荐的软件,总有一款是你的菜

    今天在知乎上看到有人分享wids10推荐好用的软件:今天小编做了一点点的修改和根据自己的使用情况总结出来转发分享给大家:   1.安全放病毒--火绒[推荐] 2.办公软件--office2019[推荐 ...

  4. 【换根DP】小奇的仓库

    题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目内容 喵星系有\(n\)个星球,星球以及星球间的航线形成一棵树. 从星球\(a\) ...

  5. rabbitmq之后台管理和用户设置

    前言 前面介绍了erlang环境的安装和rabbitmq环境安装,接下来介绍rabbitmq的web管理和用户设置. 启用后台管理插件 通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等. ...

  6. mysql锁 转

    参考文章:https://blog.csdn.net/puhaiyang/article/details/72284702 一.mysql锁的结构图 如上图所示,针对mysql的innodb存储引擎, ...

  7. Python基础数据类型方法补充

    str 补充的方法: capitalize():首字母大写,其余变小写 s = 'liBAI' s1 = s.capitalize() print(s1) # Libai swapcase():大小写 ...

  8. Anderson《空气动力学基础》5th读书笔记 第2记——流体静力学初步

    与物体在水中受到水的浮力一样,空气中的物体也会受到空气的浮力,但由于这个浮力往往比较小,实际中的很多问题我们常常将它忽略,而对于像热气球这样的靠空气的浮力产生升力的飞行器来说,空气的浮力是不能忽略的. ...

  9. oVirt4.4虚拟机备份方法

    红帽oVirt于今年推出了oVirt 4.4,该版本在系统.存储.网络.用户界面等方面做出增强功能与优化更新,为oVirt用户提供功能更强大.更灵活的IT基础架构.云祺科技也于最近发布了全新版本云祺容 ...

  10. zctf2016_note2:一个隐蔽的漏洞点挖掘

    代码量挺大的,逆起来有难度 功能挺全,啥都有 main函数 add函数,有heaparray并且无pie保护,考虑unlink show函数,可以泄漏地址用 edit函数,有两种edit方式 dele ...