go工作区
大型项目通常包含多个模块,以经典的MVC架构为例,会包含 DAO 、Service、Controller 等三层。每一层包含一个或多个模块,层与层之间通过接口进行交互。分层可以确定边界,降低复杂度,提高代码的可维护性。
go 在1.8版本引入工作区模式,在介绍 go 工作区之前,先看一下 maven 多模块的目录结构。
root
├── pom.xml
├── dao
│ └── pom.xml
├── service
│ └── pom.xml
└── controller
└── pom.xml
1. 新建main模块
新建工作区,进入工作区,新增 main 文件夹,进入 main 文件夹,初始化 main 模块,main 是工作空间的第一个模块,在 main 模块下新建 main.go 文件,作为程序的入口。关于目录、包和模块的关系,如果有疑惑,可以参考go模块学习笔记第5节的内容。
mkdir workspace
cd workspace
mkdir main
cd main
go mod init example.com/main
此时工作空间的目录结构如下
workspace
└── main
├── go.mod
└── main.go
main 里面调用 golang.org/x/example/stringutil 里面的字符串翻转函数 Reverse,将 Hello 翻转为 olleH。
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
fmt.Println(stringutil.Reverse("Hello"))
}
2. 新建工作区
在 workspace 根目录下,初始化工作区,并指定将 main 模块加入到工作区。
go work init ./main
执行完成后,根目录下增加了 go.work 文件,内容如下。此时在 workspace 根目录下可以执行 moudle main 的代码,go run example.com/main
go 1.18
use ./main
3. 增加模块
新增一个模块,替换掉 main 模块里依赖的 golang.org/x/example/stringutil。
在 workspace 根目录下新建文件夹 stringutil,进入 stringutil,初始化新的模块。
go mod init example.com/stringutil
在 stringutil 下新建 main.go 文件,编写 Reverse 方法。
package stringutil
func Reverse(string) string {
return "abc"
}
stringutil 模块已经创建完毕,现在将它加入到 workspace 里,供 main 模块使用。
go work use ./stringutil
4. 调用本地stringutil模块
将 main 模块里 golang.org/x/example/stringutil 替换成本地的 stringutil 。修改 main 模块里面的 main.go,执行go run example.com/main
,可以看到替换成功。
package main
import (
"fmt"
"example.com/stringutil"
)
func main() {
fmt.Println(stringutil.Reverse("Hello"))
}
此时,workspace 的目录结构如下。对比工作区目录结构和文章开头的 maven 的目录结构,相似度非常的高。
workspace
├── go.work
├── main
│ ├── main.go
│ ├── go.mod
│ └── go.sum
└── stringutil
├── main.go
├── go.mod
└── go.sum