简介

做大量的输入,通过对比、借鉴,加上自己的经验,产出一个尽可能优的方案。

开源界优秀项目的结构示例

因为最新的 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。

Go-项目结构和代码组织的更多相关文章

  1. Delphi 项目 结构 文件夹 组织

    Delphi Project Structure Folder Organization http://delphi.about.com/od/delphitips2008/qt/project_la ...

  2. 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释

    目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...

  3. Flask 系列之 优化项目结构

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 完善环境配置,添加 异常请求 处理 实现 400.404 ...

  4. 论vue项目api相关代码的组织方式

    论vue项目api相关代码的组织方式 看了下项目组同事的代码,发现不同项目有不同的组织版本 版本一: ├─apis │ a.api.js │ b.api.js │ b.api.js │ d.api.j ...

  5. android第一行代码-1.项目结构

    0.项目结构 一个简单的android项目结构大致如下 入口就是MainActivity这个类,如果对于一个陌生的项目,最好的办法是看AndroidMainifest.xml,如下 <?xml ...

  6. Atitit.css 规范 bem  项目中 CSS 的组织和管理

    Atitit.css 规范 bem  项目中 CSS 的组织和管理 1. 什么是BEM?1 1.1. 块(Block)2 1.2. 元素(Element)2 1.3. BEM树(和DOM树类似).3 ...

  7. nodejs实践-代码组织

    nodejs实践-代码组织 laiqun@msn.cn Contents 1. 代码组织 1. 代码组织 更新版本 npm install -g n n latest 项目文件组织 MVC 前后端代码 ...

  8. Java开发学习心得(三):项目结构

    [TOC] 3 项目结构 经过前面一系列学习,差不多对Java的开发过程有了一定的了解,为了能保持一个良好的项目结构,考虑到接下来要进行开发,还需要学习一下Java的项目结构 下面以两个项目结构为参照 ...

  9. flask实战-个人博客-虚拟环境、项目结构

    个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...

随机推荐

  1. web安全测试必须注意的五个方面

    随着互联网的飞速发展,web应用在软件开发中所扮演的角色变得越来越重要,同时,web应用遭受着格外多的安全攻击,其原因在于,现在的网站以及在网站上运行的应用在某种意义上来说,它是所有公司或者组织的虚拟 ...

  2. .NET多线程之线程安全,Lock(锁)、Monitor(同步访问)、LazyInitializer(延迟初始化)、Interlocked(原子操作)、static(静态)构造函数、volatile、

    1.什么是线程安全 线程安全是编程中的术语,指某个函数.函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成.一般来说,线程安全的函数应该为每个调用它的线程分配专门的 ...

  3. python 之 并发编程(守护进程、互斥锁、IPC通信机制)

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  4. 个人永久性免费-Excel催化剂功能第90波-xml与json数据结构转换表格结构

    在网络时代,大量的数据交互以xml和json格式提供,特别是系统间的数据交互和网络WebAPI.WebService接口的数据提供,都是通过结构化的xml或json提供给其他应用调用返回数据.若能提供 ...

  5. cve-2018-14515复现

    一.环境 Windows NT WIN-RRI9T9SN85D 6.1 build 7600 (Windows 7 Business Edition) i586 Apache/2.4.23 (Win3 ...

  6. 【git】15分钟学会使用Git和远程代码库

    Git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...

  7. 2019牛客暑期多校训练营(第三场)H题目

    题意:给你一个N×N的矩阵,求最大的子矩阵 满足子矩阵中最大值和最小值之差小于等于m. 思路:这题是求满足条件的最大子矩阵,毫无疑问要遍历所有矩阵,并判断矩阵是某满足这个条件,那么我们大致只要解决两个 ...

  8. shiro 和 spring boot 的集成

    1 添加依赖 使用 shiro-spring-boot-web-starter 在 spring boot 中集成 shiro 只需要再添加一个依赖 <dependency> <gr ...

  9. 终极CRUD-2-用lombok提高开发效率

    目录 1 lom介绍与基本使用 2 lombok 注意点 2.1 lombok自动生成方法可以混合自己写的方法 2.2 尽量不要使用@Data 2.3 属性不要使用基本类型 2.4 小心@ToStri ...

  10. Log4Net 配置日志按日期和日志级别分类写入

    配置效果图: 配置代码: <?xml version="1.0" encoding="utf-8" ?> <log4net> <! ...