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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

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