脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - 深入了解Go项目标准目录布局

深入了解Go项目标准目录布局

2022-10-07 15:06程序员读书 Golang

本文主要介绍了Go项目标准目录布局,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

很多的时候,我们开发一个简单的Go项目的时候并不需要纠结于项目的的目录布局,因为我们会将所有go源码文件扔在项目的根目录中,就像下面这样:

?
1
2
3
4
demo
├── main.go
├── model.go
└── service.go

但当我们的项目变得复杂的时候,我们就需要好好思考怎么组织我们的项目了,这时候你可能会想,用官方的Go项目目录布局就好了,然而Go的官方并没有给出一个标准的Go项目标准目录布局。

目前,Go社区开发者比较推荐的是project-layout项目中给出的目录布局,如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
demo
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── init
├── internal
├── pkg
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website

然而官方并不推荐这种项目布局方式,下面是Go团队开发leader Russ Cox对project-layout目录的意见:

深入了解Go项目标准目录布局

大体上,我们可以将Go的项目分为两类,应用项目与库项目。

  • 应用项目:即包含可执行文件的项目,项目开发后,需要编译成可执行文件并上线运行。

  • 库项目:库文件一般用于暴露Api,被其他项目通过import关键字引入。

应用项目与库项目的目录布局方式稍有差异。

应用项目

对于应用项目,其目录布局方式我们可以参考Go项目自身,以及一些使用Go语言开发的优秀开源项目(如Docker,Kubernetes,etcd)等,通过研究这些项目的目录布局,我们可以抽象出以下标准目录:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
demo
├── cmd
│   ├── app1
│   │   └── main.go
│   └── app2
│       └── main.go
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── pkg1
│   └── pkg1.go
├── pkg2
│   └── pkg2.go
└── vendor

cmd

可执行文件目录,如果一个项目有多个可执行文件,可以放在不同的子目录中,如上面例子中的app1和app2目录。

internal

项目内部私有代码,其他项目引入时会报错。

pkgN:

注意,这里并不是说一定要pkg为前缀来命名,你可以对取任意符合包命名规范的名称,比如service,model等

即上面示例中的pkg1与pkg2,pkgN包与internal包一样存放项目的依赖代码,但存储在这里的代码,可以被其项目引入。

vendor

这个目录用于存储项目的依赖包,但由于现今Go项目都是使用go module进行依赖管理,因此这个目录是可省略的。

如果我们的项目只有一个可执行文件,可以将main.go文件直接写在根目录,而vendor可以省略,因此,项目目录可以进一步精简为:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
demo
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── main.go
├── pkg1
│   └── pkg1.go
└── pkg2
    └── pkg2.go

库项目

库项目不需要可执行文件,相比于应用项目,省略了cmd目录,其标准目录下:

?
1
2
3
4
5
6
7
8
9
10
11
12
demo
├── go.mod
├── go.sum
├── internal
│   ├── pkga
│   │   └── pkg_a.go
│   └── pkgb
│       └── pkg_b.go
├── pkg1
│   └── pkg1.go
└── pkg2
    └── pkg2.go

如果我们的库项目比较简单,可以采用平铺式项目布局,即将所有的功能写在一个包里,所有源码目录放在根目录下,如:

?
1
2
3
4
5
6
demo
├── feature1.go
├── feature2.go
├── feature3.go
├── go.mod
└── go.sum

平铺式的项目布局非常适合简单的库项目,事实上,很多复杂的库项目也会将大量的代码放在根目录下,因为这样,其他项目使用import引入项目的包时,路径会比较短,比如我们有一个结构体A,放在pkg1包下与放在根目录下,其引路径分别是:

?
1
2
3
import "demo"
 
import "demo/pkg1"

小结

好了,阅读到这里,想必你已经了解了Go应用项目与库项目目录布局的不同了吧。

不过,由于Go官方项目指定的项目布局,因此上述的几种项目目录都是社区开发的约定俗成,并不具备强制性,你也可以定制自己的Go项目目录布局,不过我想,使用社区开发都遵循的目录规范,还是有助于降低团队开发人员的认知与交流成本的。

到此这篇关于深入了解Go项目标准目录布局的文章就介绍到这了,更多相关Go标准目录布局内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7094174933986574344

延伸 · 阅读

精彩推荐
  • Golang详解Golang Map中的key为什么是无序的

    详解Golang Map中的key为什么是无序的

    本文主要介绍了Golang Map中的key为什么是无序的,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    头秃猫轻王6762022-09-03
  • GolangGo语言中并发的工作原理

    Go语言中并发的工作原理

    本文详细讲解了Go语言中并发的工作原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    奋斗的大橙子8912022-07-16
  • GolangGo语言小白入门刷题打印输出沙漏

    Go语言小白入门刷题打印输出沙漏

    这篇文章主要介绍了Go语言刷题打印输出沙漏的示例过程详解,非常适合刚入门Go语言的小白学习,有需要的朋友可以借鉴参考下,希望能够有所帮助...

    小生凡一11462021-12-02
  • Golanggolang移除数组中重复的元素操作

    golang移除数组中重复的元素操作

    这篇文章主要介绍了golang移除数组中重复的元素操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    思维的深度6752021-03-17
  • GolangGo http client 连接池不复用的问题

    Go http client 连接池不复用的问题

    这篇文章主要介绍了Go http client 连接池不复用的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    qcrao6632021-03-26
  • GolangGo语言写入字符串到文件的方法

    Go语言写入字符串到文件的方法

    这篇文章主要介绍了Go语言写入字符串到文件的方法,实例分析了Go语言操作字符串及文本的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    秋风秋雨9872020-04-19
  • Golanggo语言读取json并下载高清妹子图片

    go语言读取json并下载高清妹子图片

    前面我们介绍了使用python下载高清妹子图,作为程序猿,我们当然不能只会一种语言,今天我们就来使用go语言来读取API来下载妹子图吧,有需要的宅男们...

    脚本之家5752020-04-25
  • GolangGo语言实现的最简单数独解法

    Go语言实现的最简单数独解法

    前面给大家介绍过使用javascript实现的简单的数独解法,小伙伴们都非常喜欢,今天我们再来分享一则go语言实现的简单的数独解法,有需要的小伙伴来参考...

    脚本之家3092020-04-24