这一章介绍Go语言多模块工作空间的基础概念,我们会在共享的多模块工作空间创建两个模块并修改它们,从而在构建程序过程中观察它们的变化。
前提条件
- Go语言版本1.18或更新
- 代码编辑工具
- 命令行终端
创建第一个模块
- 在根目录创建一个名为workspace的目录,并且在workspace目录下创建hello目录,并且在hello目录下使用go mod init初始化hello模块
$ cd
$ mkdir workspace
$ cd workspace
$ mkdir hello
$ cd hello
$ go mod init example.com/hello
我们要创建一个依赖于golang.org/x/example模块的hello模块,所以要先获取golang.org/x/example模块到本地,(这一步操作需要在hello目录下执行,因为go get 首先会要在当前目录找到go.mod-go mod init命令生成,否则会报错)
$ go get golang.org/x/example
- 编写hello.go代码如下:
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
fmt.Println(stringutil.Reverse("Hello")) //调用example模块中stringutil包里的reverse()方法对字符串进行翻转
}
执行go run命令得到一下输出结果:
$ go run example.com/hello
olleH
创建工作空间
上面我们只是创建了一个名为workspace的目录,要创建Go语言的工作空间需要执行go work init命令,它会生成一个go.work文件
在workspace目录执行go work init ./hello命令
$ go work init ./hello
go work init命令会在workspace目录下生成一个名为go.work的文件,它的语法类似go.mod,它告诉Go语言编译器创建一个包含了hello目录下的模块的go.wor文件。go.work文件指出了当前的workspace引用了哪些目录下的模块。
它的内容如下:
go 1.18
use (
./example
./hello
)
当工作空间初始化完成之后,你就可以在workspace目录下执行go run example.com/hello命令,并能得到和在hello目录下执行一样的结果。
下一节我们要下载golang.org/x/example模块的Git仓库到本地并且添加到我们的工作空间中进行修改,再用我们自己创建的模块来访问修改的内容。
下载并修改golang.org/x/example模块
- 使用git clone从Git仓库下载golang.org/x/example模块到本地(由于众所周的原因go.googlesource.com/example下载不了,把go.googlesource.com替换成github.com/golang的地址就可以了),在workspace目录下执行下面的命令:(可是有时候github也会访问不了,可以用它的替换地址:https://hub.fastgit.xyz)(这里有一点我还没有完全搞清楚:用git clone下载到本地,和前一章使用go get更新go.mod文件的区别是否是go get更新go.mod文件运行程序时,会在线加载example模块的代码,而git clone加载的是本地代码?)
$ git clone https://github.com/golang/example
$ git clone https://hub.fastgit.xyz/golang/example
- 在下载到本地的example/stringutil目录下新建一个go文件toupper.go,用来对输入的字母进行大写转换
package stringutil
import "unicode"
// ToUpper uppercases all the runes in its argument string.
func ToUpper(s string) string {
r := []rune(s)
for i := range r {
r[i] = unicode.ToUpper(r[i])
}
return string(r)
}
- 然后我们在hello.go中调用新创建的ToUpper()函数
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
fmt.Println(stringutil.ToUpper("Hello"))
}
- 执行go run命令观察输入结果:
$ go run example.com/hello
HELLO
go.work可以被用来代替replace命令来处理多模块调用。
更多详细的关于工作空间的内容请参考 :Workspaces