如何组织你的Go项目目录结构

2022-04-05 GoLang 大约 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下。

请注意:

  1. 请确保你已经配置的GOPATH=E:\goProject
  2. 请设置GO111MODULE=auto
goProject    
├── bin  
├── pkg                                                           
└── src                                                                                
      ├── testProject01                        
      └── testProject02                                 
1
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

这种方式的确是将每个项目都区分开了,但是每一个项目都需要一个单独都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

# 实例

# gopath mode

目录结构:

PS E:\goProject\src\testProject01> treee
testProject01  
├── main       
│   └── test.go
└── unit2
    └── testUtils
        └── testUtils.go
1
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
// 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

# go module

目录结构:

PS E:\goProject\src\awesomeProject> treee
awesomeProject
├── demo
│   └── World.go
├── go.mod
└── main.go
1
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
// World.go
package demo

var Name = "小明"
1
2
3
4

相关信息

对于新项目,强烈建议默认启用go module。并且彻底放弃gopath mode。

上次编辑于: 2023年7月4日 09:36