Golang 1.18版本发布以后,大家更多都在关注泛型,但实际上有一个可能更加有用的新功能却被大家忽略了,那就是Workspace,国内大家都习惯于称之为工作区,先来看看它能为我们带来什么帮助。
在Workspace出现之前,我们主要是使用go module来定义一个模块,如果需要引入其他模块,最常使用的的方式是通过go get或者go mod tidy的方式来引入我们的模块。但是,始终这种方式存在一些问题,首先,这样引入的其他模块是只读的,我们没有办法直接修改代码;其次,这样的方式导致每当修改被引用的模块时,都需要修改引用该模块的项目的依赖版本,这会造成很大的工作量,尤其对于某个被引用模块是我们自己定义的,而且仅在某些固定模块中引用时,这种繁杂的工作会更加多。Workspace很好的解决了这个问题,我们先来看一个使用Workspace的例子。
首先,创建一个目录utils,然后执行命令,创建一个utils的模块
go mod init utils
之后编写代码
package utils
import "fmt"
func PrintHello(what string) {
fmt.Println("Hello", what)
}
在这个包里有一个函数,打印Hello
现在,在utils的平级目录下,创建一个main目录,创建test模块
go mod init test
再写一段代码
package main
import "utils"
func main() {
utils.PrintHello("World")
}
这里大家就该奇怪了,这里import一个utils,编译不通过吧。的确,目前这样是会出现问题的,接下来就是Workspace发挥作用的时候了,先重新回到utils和main目录的父目录,执行下面的命令
go work init main
执行完命令,就会在该目录下生成一个go.work文件,我们已经初始化了一个Workspace,打开看一下,内容如下,此时该Workspace下只有一个./main目录下的模块
go 1.19
use (
./main
)
再执行命令
go work use utils
此时,go.work文件内容如下
go 1.19
use (
./main
./utils
)
也就是说现在main和utils已经归属于同一个Workspace了,现在再回去看一下之前的main.go文件,此时已经不会报错了。所以Workspace可以将多个模块归入到一个Workspace下,尤其是模块之间强依赖而且有随时调整依赖模块的需要时,这样工作会更加方便。