背景

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面试题和技术栈。

个人网站:。

知乎:。

References