使用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模式的使用方法。如果大家愿意的话,也可以在自己的电脑上试一试!

以下是我们这次创建的源代码。

 

我参考的网站

 

bannerAds