如何组织你的Go项目目录结构
2022-04-05 大约 2 分钟
不论采用何种编程语言,良好的项目组织结构都至关重要,因为这将直接影响项目内部依赖的复杂程度以及项目对外提供 API 等服务的灵活性等。最好在项目初期便制定好项目结构约定,甚至可以为其开发脚手架之类的工具来生成项目模板,让开发者尽量按照统一的规范参与项目。
# 前言
go语言发展至今因为包依赖的问题有两种构建模式:经典的gopath mode和目前的go module标准mode。在 Go 1.11 之前,Go 项目源代码通常放置在 $GOPATH/src 下;在 Go 1.11 之后,引入了 Go modules,因此你所编写的 Go 项目可以放置在任意目录。
# gopath mode
在经典的gopath mode下,事实证明的最佳实践是将多个proj放在单一GOPATH下。
请注意:
- 请确保你已经配置的
GOPATH=E:\goProject
- 请设置
GO111MODULE=auto
goProject
├── bin
├── pkg
└── src
├── testProject01
└── testProject02
1
2
3
4
5
6
2
3
4
5
6
这种方式是只有一个GOPATH然后在src文件下创建不同的项目,但是这样的话每个项目所需要的依赖也就都放在同一个地方。
goProject
├── testProject01
├── bin
├── pkg
└── src
└── testProject02
├── bin
├── pkg
└── src
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
这种方式的确是将每个项目都区分开了,但是每一个项目都需要一个单独都GOPATH。
# go module
在go module下,由于go module启用后彻底与GOPATH解绑
,因此你可以在任意路径下放置你的testProject01。并且你无需将testProject01、testProject02放置在同一个目录下,放在任意目录下均可。
goProject
├── testProject01
├── bin
├── pkg
└── src
└── testProject02
├── bin
├── pkg
└── src
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 实例
# gopath mode
目录结构:
PS E:\goProject\src\testProject01> treee
testProject01
├── main
│ └── test.go
└── unit2
└── testUtils
└── testUtils.go
1
2
3
4
5
6
7
2
3
4
5
6
7
// test.go
package main
import (
"fmt"
// 导包
"testProject01/unit2/testUtils"
)
func main() {
fmt.Println(testUtils.Name) // 小明
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
// testUtils.go
package testUtils
import "fmt"
var Name string
var Age int
func init() {
fmt.Println("我是testUtils中的Init函数")
Name = "小明"
Age = 20
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# go module
目录结构:
PS E:\goProject\src\awesomeProject> treee
awesomeProject
├── demo
│ └── World.go
├── go.mod
└── main.go
1
2
3
4
5
6
2
3
4
5
6
// main.go
package main
import (
"awesomeProject/demo"
"fmt"
)
func main() {
fmt.Println("早上好", demo.Name) // 早上好 小明
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
// World.go
package demo
var Name = "小明"
1
2
3
4
2
3
4
相关信息
对于新项目,强烈建议默认启用go module。并且彻底放弃gopath mode。