Getting started with multi-module workspaces

这一章介绍Go语言多模块工作空间的基础概念,我们会在共享的多模块工作空间创建两个模块并修改它们,从而在构建程序过程中观察它们的变化。

前提条件

  • Go语言版本1.18或更新
  • 代码编辑工具
  • 命令行终端

创建第一个模块

  1. 在根目录创建一个名为workspace的目录,并且在workspace目录下创建hello目录,并且在hello目录下使用go mod init初始化hello模块
$ cd
$ mkdir workspace
$ cd workspace
$ mkdir hello
$ cd hello
$ go mod init example.com/hello

我们要创建一个依赖于golang.org/x/example模块的hello模块,所以要先获取golang.org/x/example模块到本地,(这一步操作需要在hello目录下执行,因为go get 首先会要在当前目录找到go.mod-go mod init命令生成,否则会报错)

$ go get golang.org/x/example 
  1. 编写hello.go代码如下:
package main

import (
    "fmt"

    "golang.org/x/example/stringutil"
)

func main() {
    fmt.Println(stringutil.Reverse("Hello")) //调用example模块中stringutil包里的reverse()方法对字符串进行翻转
}

执行go run命令得到一下输出结果:

$ go run example.com/hello
olleH

创建工作空间

上面我们只是创建了一个名为workspace的目录,要创建Go语言的工作空间需要执行go work init命令,它会生成一个go.work文件
在workspace目录执行go work init ./hello命令

$ go work init ./hello

go work init命令会在workspace目录下生成一个名为go.work的文件,它的语法类似go.mod,它告诉Go语言编译器创建一个包含了hello目录下的模块的go.wor文件。go.work文件指出了当前的workspace引用了哪些目录下的模块。
它的内容如下:

go 1.18

use (
        ./example
        ./hello
)

当工作空间初始化完成之后,你就可以在workspace目录下执行go run example.com/hello命令,并能得到和在hello目录下执行一样的结果。
下一节我们要下载golang.org/x/example模块的Git仓库到本地并且添加到我们的工作空间中进行修改,再用我们自己创建的模块来访问修改的内容。

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

  1. 使用git clone从Git仓库下载golang.org/x/example模块到本地(由于众所周的原因go.googlesource.com/example下载不了,把go.googlesource.com替换成github.com/golang的地址就可以了),在workspace目录下执行下面的命令:(可是有时候github也会访问不了,可以用它的替换地址:https://hub.fastgit.xyz)(这里有一点我还没有完全搞清楚:用git clone下载到本地,和前一章使用go get更新go.mod文件的区别是否是go get更新go.mod文件运行程序时,会在线加载example模块的代码,而git clone加载的是本地代码?)
$ git clone https://github.com/golang/example
$ git clone https://hub.fastgit.xyz/golang/example
  1. 在下载到本地的example/stringutil目录下新建一个go文件toupper.go,用来对输入的字母进行大写转换
package stringutil

import "unicode"

// ToUpper uppercases all the runes in its argument string.
func ToUpper(s string) string {
    r := []rune(s)
    for i := range r {
        r[i] = unicode.ToUpper(r[i])
    }
    return string(r)
}
  1. 然后我们在hello.go中调用新创建的ToUpper()函数
package main

import (
    "fmt"

    "golang.org/x/example/stringutil"
)

func main() {
    fmt.Println(stringutil.ToUpper("Hello"))
}
  1. 执行go run命令观察输入结果:
$ go run example.com/hello
HELLO

go.work可以被用来代替replace命令来处理多模块调用。
更多详细的关于工作空间的内容请参考 :Workspaces

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • go的多模块工作区是从1.18 版本开始的,所以要使用它首先要确认go 的版本。 一下教程介绍了一个多模块工作区的...
    husky_1阅读 10,150评论 0 2
  • 一,module的来源定义 go1.11和go1.12对golang的 module做了一个试水,从go1.13开...
    舒小贱阅读 5,405评论 0 0
  • 为什么要学 Go 性能优越感;Go 极其地快,其性能与 Java 或 C++相似。在使用中,Go 一般比 Pyth...
    drunkery阅读 2,532评论 1 1
  • 在学完 Go 的语法之后,就可以开始写代码了,但一个项目中不可能只有几个代码文件,而是由很多代码组成,下面这篇文章...
    rayjun阅读 5,660评论 0 4
  • Go的1.11和1.12版本包括对模块--新的Go依赖管理系统的初步支持,使依赖版本信息变得明确且更易于管理。这篇...
    Java天天阅读 7,741评论 0 1