Go-项目结构和代码组织
简介
做大量的输入,通过对比、借鉴,加上自己的经验,产出一个尽可能优的方案。
开源界优秀项目的结构示例
因为最新的 Go 版本已经使用 module 作为版本依赖,所以,所有项目的 vendor 我都忽略,建议直接使用 module 来管理依赖,而且较好的解决某些库国内访问不了的问题,参考:https://studygolang.com/topics/8737
Docker
https://github.com/moby/moby
├── api // 存放对外公开的 API 规则
├── builder // 存放构建脚本等
├── cli // 命令行的主要逻辑
├── cmd // 存放可执行程序,main 包放这个目录中
├── contrib // 存放一些有用的脚本或文件,但不是项目的核心部分
├── docs // 存放文档
├── internal // 只在本项目使用的包(私有)
├── pkg // 本项目以及其他项目可以使用的包(公有)
├── plugin // 提供插件功能
Kubernetes
https://github.com/kubernetes/kubernetes
├── api
├── build // 存放构建脚本等
├── cmd
├── docs
├── pkg
├── plugin
├── test // 单元测试之外的测试程序、测试数据
├── third_party // 经过修改的第三方的代码
Gogs
https://github.com/gogs/gogs
├── cmd
├── conf // 对配置进行解析
├── docker // 存放 docker 脚本
├── models // MVC 中的 model
├── pkg
├── public // 静态公共资源,实际项目会将其存入 CDN
├── routes // 路由
├── scripts // 脚本文件
├── templates // 存放模板文件
``### influxdb
https://github.com/influxdata/influxdb
├── cmd
├── docker
├── docs
├── http // 存放 HTTP Handler 等,相当于 MVC 的 Controller
├── internal
├── models
├── pkg
├── scripts
```
开源项目小结
总体上,这些优秀开源项目,没有统一一致的目录结构方式,但大体上,有一些通用的地方,这就有了** https://github.com/golang-standards/project-layout **这个项目。
标准 Go 项目布局(结构)
https://github.com/golang-standards/project-layout 项目总结了 Go 项目的布局,我们一起看看这些主要的目录。
/cmd
该目录用于存放 Go 项目的入口,即 main.main。一般来说,我们应该在 cmd 目录下创建子目录,子目录名称代表可执行程序的名称。上面列出的优秀开源项目基本上遵循了这一规则。
事实上,Go 语言本身,以及 github.com/golang/tools 都采用了 cmd 及其子目录的形式,所以咱们的项目没有理由不使用。
一般来说,该目录中的代码应该尽可能少。
/internal
这是 Go 包的一个特性,放在该包中的代码,表明只希望项目内部使用,是项目或库私有的,其他项目或库不能使用。
/pkg
该包可以和 internal 对应,是公开的。一般来说,放在该包的代码应该和具体业务无关,方便本项目和其他项目重用。当你决定将代码放入该包时,你应该对其负责,因为别人很可能使用它。
因为 GOPATH 中有一个目录就是 pkg,所以,社区有些人对该目录不太能接受。但不管怎么样,开源界有很多优秀项目在使用它,这里有一些使用它的项目列表:
https://github.com/golang-standards/project-layout/blob/master/pkg/README.md
/api
该目录用来存放 OpenAPI/Swagger 规则说明, JSON 格式定义, 协议定义文件等。也有可能用来存放具体的对外公开 API,比如 Docker:https://github.com/moby/moby/tree/master/api/server 。
/init
存放随着系统自动启动脚本,如:systemd, upstart, sysv;或者通过 supervisor 进行进程管理的脚本。
/scripts
存放 build、install、analysis 等操作脚本。这些脚本使得项目根目录的 Makefile 很简洁。
/build
该目录用于存放打包和持续集成相关脚本。
/test
一般用来存放除单元测试、基准测试之外的测试,比如集成测试、测试数据等。
Go 语言源码仓库中就有 test 目录。
/docs
存放设计和用户文档
/tools
存放项目的支持工具。
/third_party
从第三代码包抽取过来的。根据官方建议,包名不应该有 _,所以本人不建议使用。真有这样的需要,考虑命名为 thirdparty。
转载于:https://www.cnblogs.com/Paul-watermelon/p/11230197.html
Go-项目结构和代码组织相关推荐
- 各类Python项目的项目结构及代码组织最佳实践
1. 了解Python项目文件组织结构非常重要 为什么要掌握pythob项目结构? 优秀的程序员都使用规范的项目代码结构,了解这些好的习惯方式,能帮助你快速读懂代码 如果项目是几个人合作开发,好的代码 ...
- python实现红警三录像文件读取与自动分析生成流程图信息——二、项目结构与代码初步介绍
总目录 一.简介 二.项目结构与代码初步介绍 三.拓展给mod使用 ======================= 大爽歌作,made by big shuang ================== ...
- web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...
我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...
- 常见开源项目结构划分
(转载自 CodeSheep 程序羊) 我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源 ...
- 看完这篇,别人的开源项目结构应该能看懂了
我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...
- 在阿里工作5年了,看完这篇,别人的开源项目结构应该能看懂了
很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙,不知道应该以一个什么样的思路去学习和吸收别人的项目. 好,今天熬夜肝了这篇文章,和大家一起来交流探讨一下,不足之处也请小伙伴们批 ...
- 【Lilishop商城】No2-1.确定项目结构和数据结构(用户、商品、订单、促销等模块)
仅涉及后端,全部目录看顶部专栏,代码.文档.接口路径在: [Lilishop商城]记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 首先先看一下项目的开发架构,都需要哪些技术,都按 ...
- 代码重构之旅(一) 项目结构
起因 之前说过自己被分配了一个重构代码的任务: 这是一个有6.7年历史,多人经手的老系统,PHP 语言,分布在50台机器上运行.代码使用最简单的结构,没有使用任何完整框架,甚至有三四千行代码的文件,修 ...
- Maven笔记(2)-- 常用命令和标准的Maven项目结构
http://www.cnblogs.com/luxh/archive/2012/11/06/2757441.html 1.常用命令 1)创建一个Project mvn archetype:gener ...
最新文章
- 2017浅谈面试(一)
- 四舍五入到小数点后两位[重复]
- 吴恩达的 AI 战略强调了什么?
- [Ubuntu] 解决 pip 安装 lxml 出现 x86_64-linux-gnu-gcc 异常
- php listview,ListView简单实用
- 《四世同堂》金句摘抄(九)
- 关于数据权限的几个问题
- Error: Loading chunk * failed,Vue Router懒加载报错问题解决方案
- mysql 时间戳与java_在Java中处理MySQL日期时间和时间戳
- 【前端】h5音乐播放demo 可关闭可播放
- R语言|ggtreeExtra包绘制进化树
- java 授课录像_讲课视频录制方法,录制上课录像详细步骤
- 排列组合思维导图_图形推理 思维导图 百度文库
- PDF转PNG高清不失帧
- 苹果地图副总裁_挖角苹果高级计算机视觉专家 Mapillary地图更新添一员大将
- 星火计划 | Apache InLong一站式大数据接入平台沙龙火热报名中
- DDoS 攻击防御方法
- js 正则知识汇总(转)
- echarts实现中国地图的下钻和返回上一级
- 数据结构与算法笔记:抽象思维之对比算法,发现共性(下楼梯台阶和象棋跳马问题算法重构)
热门文章
- attr和prop的区别
- Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
- Ajax请求利用jsonp实现跨域
- Java并发编程--理解ThreadLocal
- 有空研究这篇http://blog.csdn.net/studyvcmfc/article/details/7720258 研究后写篇记录
- 华中地区高校第七届ACM程序设计大赛——之字形矩阵【2012年5月27日】
- Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明
- c#反混淆工具de4dot 一般混淆都可以解决
- 几个常用算法的适应场景及其优缺点
- pip国内加载速度慢解决方法