• Go的简单入门:开始使用多模块的工作空间


    开始使用多模块的工作空间

    一、说明

    这篇指导,介绍Go中基础的多模块工作空间。使用多模块工作空间。你能告诉Go命令,你将同时在多模块写代码,并且很容易在这些模块构建和运行代码。

    在这篇指导中,你将用一个共享的多模块工作空间创建两个模块。跨越这些模块进行更改,并且在构建中看到这些结果的改变。

    二、准备

    • 安装Go 1.18 或更高版本;
    • 一个编辑代码的工具;
    • 一个命令行终端;

    三、为你的代码查u你更加爱你一个模块

    1. 打开命令行,切换到工作目录

      $ cd 
      $
      
      • 1
      • 2
    2. 创建一个叫workspace的目录,并进入目录

      $ mkdir workspace
      $ cd workspace/
      $
      
      • 1
      • 2
      • 3
    3. 初始化那个模块

      我们的例子中,将创建一个新的hello模块,将依赖于golang.org/x/example模块。

      创建一个hello模块:

      $ mkdir hello
      $ cd hello/
      $ go mod init example.com/hello
      go: creating new go.mod: module example.com/hello
      $
      
      • 1
      • 2
      • 3
      • 4
      • 5

      通过使用go get命令添加依赖于golang.org/x/example模块。

      $ go get golang.org/x/example
      go: downloading golang.org/x/example v0.0.0-20220412213650-2e68773dfca0
      go: added golang.org/x/example v0.0.0-20220412213650-2e68773dfca0
      $
      
      • 1
      • 2
      • 3
      • 4

      hello文件夹中创建一个hello.go文件,里面包含下面的内容:

      package main
      
      import (
        "fmt"
        "golang.org/x/example/stringutil"
      )
      
      
      func main() {
        fmt.Println(stringutil.Reverse("Hello"))
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      现在,运行hello程序:

      $ go run example.com/hello
      olleH
      $
      
      • 1
      • 2
      • 3

    四、创建工作空间

    在这一步,我们将创建go.work文件,使用模块指定一个工作空间。

    4.1 初始化工作空间

    workspace 目录下,运行:

    $ go work init ./hello
    $
    
    • 1
    • 2

    go work init命令告诉go为一个包含./hello目录中的模块的工作空间,创建一个go.work文件。

    这个go命令产生的go.work文件,看起来像这样:

    $ ll
    total 8
    drwxr-xr-x  4 lifei  staff  128  8 22 22:30 ./
    drwxr-xr-x  6 lifei  staff  192  8 22 22:18 ../
    -rw-r--r--  1 lifei  staff   21  8 22 22:30 go.work
    drwxr-xr-x  5 lifei  staff  160  8 22 22:26 hello/
    $ cat go.work
    go 1.18
    
    use ./hello
    $
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    go.work文件拥有go.mod文件相似的语法。

    go 指令告诉 Go 应该使用哪个版本的 Go 来解释文件。它go.mod中go指令是类似的。

    use指令告诉Go,当做构建的时候,在目录hello中的模块,是主模块。

    4.2 在workspace目录下运行程序

    workspace目录下,运行:

    $ go run example.com/hello
    olleH
    $
    
    • 1
    • 2
    • 3

    这个Go命令包含所有在工作空间中的所有模块作为主模块。这允许我们在模块中引用一个包,甚至在模块之外。运行go run命令在模块或工作空间外面,将产生错误结果,因为go命令不知道应该使用哪个模块。

    接下来,我们将添加一个本地拷贝golang.org/x/example模块到工作空间。我们将添加一个新的函数到stringutil模块中,我们能够使用,用来替换Reverse

    五、下载并修改golang.org/x/example模块

    在这一步,我们将下载一个Git仓库到拷贝,包含了golang.org/x/example模块,添加它到工作空间。添加一个新的函数到它里面,然后我们在hello程序中使用。

    1. 拷贝仓库

      workspace目录下,运行git命令,拷贝仓库。

      $ git clone https://go.googlesource.com/example
      Cloning into 'example'...
      remote: Total 204 (delta 93), reused 204 (delta 93)
      Receiving objects: 100% (204/204), 103.24 KiB | 1006.00 KiB/s, done.
      Resolving deltas: 100% (93/93), done.
      $
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    2. 添加模块到工作空间

      $ go work use ./example
      $
      
      • 1
      • 2

      go work use命令,添加一个新的模块到go.work文件中。它看起来像这样:

      $ cat go.work
      go 1.18
      
      use (
      	./example
      	./hello
      )
      $
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      这个模块,现在既包含了example.com/hello模块,也包含了golang.org/x/example模块。

      这将允许我们使用新代码,我们将在stringutil 模块中写的,替换我们通过go get命令下载,在模块缓存中的模块版本。

    3. 添加新函数

      我们将添加一个新函数,去讲字符串变成大写,到golang.org/x/example/stringutil包中。

      workspace/example/stringutil目录中,创建一个文件名叫toupper.go的文件,包含下面的内容:

      package stringutil
      
      import "unicode"
      
      // 将参数中的所有字符转成大写
      func ToUpper(s string) string {
        r := []rune(s)
        for i := range r {
          r[i] = unicode.ToUpper(r[i])
        }
        return string(r)
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    4. 修改hello程序,使用函数

      修改workspace/hello/hello.go文件,包含下面的内容:

      package main
      
      import (
      	"fmt"
      
      	"golang.org/x/example/stringutil"
      )
      
      func main() {
      	// fmt.Println(stringutil.Reverse("Hello"))
      	fmt.Println(stringutil.ToUpper("Hello"))
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      在工作空间中运行代码:

      $ go run example.com/hello
      HELLO
      $
      
      • 1
      • 2
      • 3

      Go 命令在 go.work 文件指定的 hello 目录中查找命令行中指定的 example.com/hello 模块,同样使用 go.work 文件解析 golang.org/x/example 导入。

      可以使用 go.work 代替添加replace指令来跨多个模块工作。

      因为两个模块在同一个工作空间,所以你很容易在一个模块中改变,然后在另一个模块中使用。

    更进一步:

    现在,要正确发布这些模块,我们需要发布 golang.org/x/example 模块,例如,v0.1.0。这通常通过在模块的版本控制存储库上标记提交来完成。

    发布完成后,我们可以在 hello/go.mod 中增加对 golang.org/x/example 模块的要求:

    $ cd hello/
    $ go get golang.org/x/example@v0.1.0
    
    
    • 1
    • 2
    • 3

    这样, go 命令可以正确解析工作区之外的模块。

    六、更多关于工作空间

    • go work use [-r] [dir]为 dir 的 go.work 文件添加一个 use 指令(如果存在),如果参数目录不存在,则删除 use 目录。-r 标志递归地检查 dir 的子目录。
    • go work edit 编辑go.work文件,类似go mod edit
    • go work sync将工作区构建列表中的依赖项同步到每个工作区模块中。
  • 相关阅读:
    【JavaScript-事件②】表单元素的属性操作,密码显示隐藏的实现
    项目管理软件排行榜:点赞榜TOP5揭晓!
    B+树索引(6)之MyISAM索引方案
    132.(后端)订单管理Model与初始化数据——一对多关系的表模型建立与数据填充
    2022年最新四川交安安全员考试题库及答案
    让org mode导出结果更好看
    JVM内存模型:PC程序计数器
    微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面
    Vue开发实例(六)实现左侧菜单导航
    「Python条件结构」使用逻辑运算符将多个if条件连接
  • 原文地址:https://blog.csdn.net/hefrankeleyn/article/details/126475527