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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iref streams_如何利用Neo4j Streams并建立即时数据仓库

iref streamsby Andrea Santurbano通过安德里亚桑图尔巴诺(Andrea Santurbano) 如何利用Neo4j Streams并建立即时数据仓库 (How to leverage Neo4j Streams and build a just-in-time data warehouse) In this article, we’ll show how to create a Just-In-Time Data Wareho…

Nodejs正则表达式函数之match、test、exec、search、split、replace使用详解

1. Match函数使用指定的正则表达式函数对字符串惊醒查找,并以数组形式返回符合要求的字符串原型:stringObj.match(regExp)参数:stringObj 必选项,需要去进行匹配的字符串RegExp 必选项,指定的正则表达式返回值&#xf…

Zabbix 3.0 从入门到精通(zabbix使用详解)

第1章 zabbix监控 1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也称为可用性,英文描述为HA,High Avail…

python 装饰器装饰类_5分钟的Python装饰器指南

python 装饰器装饰类重点 (Top highlight)There’s no doubt that Python decorators are one of the more advanced and tougher-to-understand programming concepts. This doesn’t mean you should avoid learning them — as you encounter them in production code soone…

php中颜色的索引值,计算PHP中两种颜色之间的平均颜色,使用索引号作为参考值...

我们假设为了讨论的目的,每个颜色都有一个“值”.那么,你想要的就足够简单:$index 0.2;$val1 get_value_of_color($color1);$val2 get_value_of_color($color2);$newval $val1 * $index $val2 * (1 - $index);$newcolor get_color_from_value($newval);所以,很…

leetcode 989. 数组形式的整数加法

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X 1231,那么其数组形式为 [1,2,3,1]。 给定非负整数 X 的数组形式 A,返回整数 XK 的数组形式。 示例 1: 输入:A […

您需要了解的WordPress漏洞以及如何修复它们

by Joel S. Syder乔尔赛德(Joel S.Syder) 您需要了解的WordPress漏洞以及如何修复它们 (WordPress vulnerabilities you need to know about — and how to fix them) WordPress is an incredibly useful and versatile platform for all kinds of blogging. It’s become ver…

Maven基础。

---恢复内容开始--- Maven: 1、概念。 * maven 是一个项目管理工具。 * maven的作用。 1、jar包。依赖管理。将jar包放在jar包仓库(pom.xml),不需要每个项目都添加jar包。 2、测试。 3、项目发布。 2、使用。 * 下载解压即可。 * 环境变量配置…

Dinosaur Run - Dinosaur world Games

转载于:https://www.cnblogs.com/hotmanapp/p/7092669.html

机器学习实际应用_机器学习的实际好处是什么?

机器学习实际应用Some of my previous introductory posts to machine learning and data science were a bit technical. However, my purpose of this post is to explain some of the practical use-cases of ML solely from a non-technical savvy layman’s perspective w…

Javascript的setTimeOut()和setInterval()的定时器用法

Javascript用来处理延时和定时任务的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。 setTimeout()…

php随机生成车牌号,生成汽车牌照

用户随机50选1。好的车牌用户选不到。我目前的做法是这样的。所有车牌入库。别人选了状态就修改为1。下面是入库程序,想跟大家讨论一下,有没有更好的方式。use Illuminate\Database\Seeder;class LicensePlatesTableSeeder extends Seeder{public functi…

Go_ go mod 命令解决墙的问题

简介 由于众所周知的原因,在下载一些库的时候会下载不了,比如 golang.org/x/... 相关的库。为此,网上出现了很多解决方案。 从 Go1.11 开始,Go 引入了 module,对包进行管理,通过 go mod 命令来进行相关操作…

leetcode 1319. 连通网络的操作次数(并查集)

用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个…

MySQL中choose标签的用法

先给大家来个SQL语句&#xff1a; choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似。 <select id"getMemberInfo" resultType"java.util.Map" parameterType"java.util.Map" > SELECT …

php hsetnx,HSETNX命令_视频讲解_用法示例-redis编程词典-php中文网

set英 [set] 美 [sɛt]vt.设置;放置&#xff0c;安置;使处于某种状况;摆放餐具vi.落山;出发;凝结n.集合;一套&#xff0c;一副;布景;电视机adj.固定的;位于…的;顽固的;安排好的第三人称单数&#xff1a; sets 复数&#xff1a; sets 现在分词&#xff1a; setting 过去式&am…

用导函数的图像判断原函数的单调性

前言 典例剖析 例1(给定\(f(x)\)的图像&#xff0c;确定\(f(x)\)的单调性&#xff0c;最简单层次) 题目暂略。 例2(用图像确定\(f(x)\)的正负&#xff0c;确定\(f(x)\)的单调性&#xff0c;2017聊城模拟) 已知函数\(yxf(x)\)的图像如图所示(其中\(f(x)\)是函数\(f(x)\)的导函数…

朴素贝叶斯 半朴素贝叶斯_使用朴素贝叶斯和N-Gram的Twitter情绪分析

朴素贝叶斯 半朴素贝叶斯In this article, we’ll show you how to classify a tweet into either positive or negative, using two famous machine learning algorithms: Naive Bayes and N-Gram.在本文中&#xff0c;我们将向您展示如何使用两种著名的机器学习算法&#xff…

python3:面向对象(多态和继承、方法重载及模块)

1、多态 同一个方法在不同的类中最终呈现出不同的效果&#xff0c;即为多态。 class Triangle:def __init__(self,width,height):self.width widthself.height heightdef getArea(self):areaself.width* self.height / 2return areaclass Square:def __init__(self,size):sel…

蠕变断裂 ansys_如何避免范围蠕变,以及其他软件设计课程的辛苦学习方法

蠕变断裂 ansysby Dror Berel由Dror Berel 如何避免范围蠕变&#xff0c;以及其他软件设计课程的辛苦学习方法 (How to avoid scope creep, and other software design lessons learned the hard way) 从数据科学的角度来看。 (From a data-science perspective.) You’ve got…