使用Go的Workspace模式来学习并实践操作
请查看以前的模块管理方法。
执行环境
-
- M1 Macbook Air
-
- macOS Monterey 12.4
- Go 1.18
只要在Windows上正确安装了Go,就没问题。
“工作区模式”的含义是
使用一个名为go.work的文件来管理多个模块,并实现模块之间的无缝连接。
go 1.18
use (
./module1
./module2
)
您可以以这种方式管理多个模块。
工作空间的命令
我有一些不同的指令,但我会介绍常用的init和use指令。
开始
在初始化go.work文件时使用。
% go work init
您可以在init后面添加已经创建的模块。
go work init モジュール名
使用
當已經創建了go.work文件並且想要添加新的模塊時,使用以下方法。
% go work use モジュール名
在您想添加多个模块的情况下,请在它们之间留出空间写上其名称。
% go work use モジュール1 モジュール2
让我们实际尝试一下
首先,让我们创建一个目录。
这次我们通过名为workspace的名字创建一个目录,并且进入workspace目录。
% mkdir workspace && cd workspace
在工作空间目录下创建一个名为hello的文件夹,并进入hello文件夹。
workspace % mkdir hello && cd hello
你好目录
在hello目录中创建一个hello.go文件。
hello % touch hello.go
你好,我会写hello.go的代码。
package hello
import "fmt"
func Hello(name string) {
fmt.Printf("Hello, %s!", name)
}
在hello目录下创建go.mod文件。
hello % go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go: to add module requirements and sums:
go mod tidy
主要目录
在工作区内,按照与 hello 文件夹相同的步骤创建一个 main 文件夹,并进入 main 文件夹。
hello % cd ../
workspace % mkdir main && cd main
在主目录下创建一个名为main.go的文件。
main % touch main.go
我将编写main.go。
package main
import "example.com/hello"
func main() {
hello.Hello("Yuuki")
}
在主要目录下创建go.mod文件。
main % go mod init example.com/main
go: creating new go.mod: module example.com/main
go: to add module requirements and sums:
go mod tidy
如果继续这样,即使运行main.go也会发生错误。
main % go run main.go
main.go:3:8: no required module provides package example.com/hello; to add it:
go get example.com/hello
创建go.work
让我们返回workspace目录并创建一个名为go.work的文件。
main % cd ../
workspace % go work init main hello
在工作空间目录下创建了一个名为go.work的文件。
go 1.18
use (
./hello
./main
)
试试看
让我们切换到main目录并运行main.go文件。
workspace % cd main
main % go run main.go
Hello, Yuuki!
很好地运作了!不需要像过去那样反复编写替换文,只需创建go.work就能轻松使用其他模块的方法了!
目录结构如下所示。
workspace % tree
.
├── go.work
├── hello
│ ├── go.mod
│ └── hello.go
└── main
├── go.mod
└── main.go
尝试添加一个新模块
本次我们将使用echo框架创建一个服务器启动模块。
在工作目录下创建并切换到一个新的server文件。
在workspace的目录里创建一个新的server文件,并切换到该文件。
workspace % mkdir server && cd server
在服务器目录下创建go.mod文件。
server % go mod init example.com/server
go: creating new go.mod: module example.com/server
在服务器目录中安装“echo”。
server % go get github.com/labstack/echo/v4
go: added github.com/labstack/echo/v4 v4.7.2
go: added github.com/labstack/gommon v0.3.1
go: added github.com/mattn/go-colorable v0.1.11
go: added github.com/mattn/go-isatty v0.0.14
go: added github.com/valyala/bytebufferpool v1.0.0
go: added github.com/valyala/fasttemplate v1.2.1
go: added golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
go: added golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f
go: added golang.org/x/sys v0.0.0-20211103235746-7861aae1554b
go: added golang.org/x/text v0.3.7
我认为在server目录中创建了go.sum文件,并且go.mod和go.sum文件看起来是这样的。
module example.com/server
go 1.18
require (
github.com/labstack/echo/v4 v4.7.2 // indirect
github.com/labstack/gommon v0.3.1 // indirect
github.com/mattn/go-colorable v0.1.11 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.1 // indirect
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect
golang.org/x/text v0.3.7 // indirect
)
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/labstack/echo/v4 v4.7.2 h1:Kv2/p8OaQ+M6Ex4eGimg9b9e6icoxA42JSlOR3msKtI=
github.com/labstack/echo/v4 v4.7.2/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks=
github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o=
github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=
github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b h1:1VkfZQv42XQlA/jchYumAnv1UPo6RgF9rJFkTgZIxO4=
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
在服务器目录下创建一个名为server.go的文件。
touch server.go
我编写了server.go文件。
package server
import (
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"net/http"
)
func StartServer() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Routes
e.GET("/", helloHandler)
// Start server
e.Logger.Fatal(e.Start(":1234"))
}
func helloHandler(c echo.Context) error {
return c.String(http.StatusOK, "Hello World!")
}
在go.work上添加备注
如果保持这样的状态,会出现错误,所以请将工作空间目录切换到并使用use命令。
server % cd ../
workspace % go work use server
如果添加了「./server」就可以了。
go 1.18
use (
./hello
./main
./server // 追加
)
在main.go文件中添加附加内容。
在main.go文件中,编写StartServer方法。
package main
import (
"example.com/hello"
"example.com/server" // 追加
)
func main() {
hello.Hello("Yuuki")
server.StartServer() // 追加
}
试试看
让我们切换到主目录并尝试执行main.go。
workspace % cd main
main % go run main.go
Hello, Yuuki!
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.7.2
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:1234
如果在这个URL上显示出”Hello World!”,那就可以了。
最终的目录结构如下所示。
.
├── go.work
├── go.work.sum
├── hello
│ ├── go.mod
│ └── hello.go
├── main
│ ├── go.mod
│ └── main.go
└── server
├── go.mod
├── go.sum
└── server.go
总结
在实际写作过程中,我学习了有关workspace模式的使用方法。如果大家愿意的话,也可以在自己的电脑上试一试!
以下是我们这次创建的源代码。
我参考的网站