背景
Go 1.18除了引入泛型(generics)、模糊测试(Fuzzing)之外,另外一个重大功能是引入了工作区模式(workspace mode)。
工作区模式对本地同时开发多个有依赖的Module的场景非常有用。
example.com/mainexample.com/utilexample.com/mainexample.com/util
我们来看看Go 1.18版本前后如何处理这种场景。
Go 1.18之前怎么做
在Go 1.18之前,对于上述场景有2个处理方案:
方案1:被依赖的模块及时提交代码到代码仓库
example.com/mainexample.com/utilexample.com/mainexample.com/util
example.com/utilexample.com/mainexample.com/utilgo get -u
example.com/utilexample.com/mainexample.com/util
方案2:go.mod里使用replace指令
为了解决方案1的痛点,于是有了方案2:在go.mod里使用replace指令。
example.com/utilexample.com/util
为了方便大家理解,我们直接上代码。代码目录结构如下:
module
|
|------main
| |---main.go
| |---go.mod
|------util
| |---util.go
| |---go.mod
main.go
//main.go
package main
import (
"fmt"
"example.com/util"
)
func main() {
result := util.Add(1, 2)
fmt.Println(result)
}
go.mod
module example.com/main
go 1.16
require example.com/util v1.0.0
replace example.com/util => ../util
util.go
// util.go
package util
func Add(a int, b int) int {
return a + b
}
go.mod
module example.com/util
go 1.16
example.com/maingo.mod
module example.com/main
go 1.16
require example.com/util v1.0.0
replace example.com/util => ../util
example.com/mainexample.com/util
$ cd main
$ go run main.go
3
example.com/main
代码开源地址:
Go 1.18工作区模式
为了解决方案2的痛点,在Go 1.18里新增了工作区模式(workspace mode)。
go.modgo.work
话不多说,直接上代码。代码目录结构如下:
workspace
|------go.work
|
|------main
| |---main.go
| |---go.mod
|------util
| |---util.go
| |---go.mod
main.go
//main.go
package main
import (
"fmt"
"example.com/util"
)
func main() {
result := util.Add(1, 2)
fmt.Println(result)
}
go.mod
module example.com/main
go 1.16
require example.com/util v1.0.0
util.go
// util.go
package util
func Add(a int, b int) int {
return a + b
}
go.mod
module example.com/util
go 1.16
go.work
go 1.18
use (
./main
./util
)
go.work
$ go1.18beta1 work init main util
main.go
$ go1.18beta1 run main/main.go
3
$ cd main/
$ go1.18beta1 run main.go
3
example.com/maingo.modexample.com/main
代码开源地址:
go.work
总结
为了解决多个有依赖的Module本地同时开发的问题,Go 1.18引入了工作区模式。
工作区模式是对已有的Go Module开发模式的优化,关于工作区模式的更多细节可以参考本文最后的References。
开源地址
文章和示例代码开源在GitHub: 。
公众号:coding进阶。关注公众号可以获取最新Go面试题和技术栈。
个人网站:。
知乎:。