史上最全的Go语言模块(Module)管理详解(基于Go1,2024年最新字节跳动Golang内部学习资料泄露

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

“github.com/unitymarvel/ModuleB”
)
func OutputMsg(str string) {
fmt.Println(ModuleB.Greet(str))
}

步骤6:编写Demo.go的代码

package main

import (
“fmt”
“github.com/unitymarvel/ModuleA”
“github.com/unitymarvel/ModuleB”
)

func main() {
ModuleA.OutputMsg(“李宁”)
fmt.Println(ModuleB.Greet(“Bill”))
}

很明显,在A.go文件中引用了ModuleB模块,而在Demo.go文件中同时引用了ModuleA模块和ModuleB模块。在终端进入demo目录,并执行go run Demo.go,肯定不会执行的,会抛出如下的异常:
         错误信息的基本含义就是github.com/unitymarvel/ModuleA和github.com/unitymarvel/ModuleB这两个地址根本没有对应的模块,所以就要使用本地模块,但Go编译器也不知道本地模块在什么位置,所以就会运行失败。
现在要让Go编译器知道本地模块的位置,通常在go.mod文件中使用replace指令将域名映射到本地的模块目录,所以应该按下面的步骤修改对应模块的go.mod文件。

步骤7:修改ModuleA/go.mod文件

修改后的结果如下:

module github.com/unitymarvel/ModuleA
go 1.19
require github.com/unitymarvel/ModuleB v1.0.0
replace github.com/unitymarvel/ModuleB => …/ModuleB

replace执行中,”=>“左侧的部分是模块对应的网址,右侧对应了本地模块目录,可以使用相对路径,也可以使用绝对路径。

步骤8:修改Demo/go.mod文件

修改后的结果如下:

module github.com/unitymarvel/Demo
go 1.19
require github.com/unitymarvel/ModuleA v1.0.0
require github.com/unitymarvel/ModuleB v1.0.0

replace github.com/unitymarvel/ModuleA => …/ModuleA
replace github.com/unitymarvel/ModuleB => …/ModuleB

现在运行go run Demo.go,就会输出如下的内容:

Hello 李宁

Hello Bill

以上使用了go modules的方式管理了ModuleA和ModuleB,尽管go.mod文件中使用了相对路径,pull也不会有路径问题,但由于ModuleB被引用了两次,这就意味着,如果ModuleB的位置或模块名发生了变化,那么就要修改两个地方,如果一个模块被引用了100次,那么就要修改100个地方,这将会带来灾难性的后果,有可能整个工程最后会乱套了。而如果使用go.work文件管理模块,那么不管模块路径和模块名如何变化,只需要修改go.work文件中的内容即可,而且不管模块名被引用多少次,只需要修改一次即可。

2. 使用工作区管理Go模块

使用工作区管理Go模块必须使用Go1.18或以上版本,使用其他Go版本的同学赶快升级。

在终端进入工程根目录,执行下面的命令创建go.work文件。

go work init ModuleA ModuleB Demo

其中ModuleA、ModuleB和Demo是3个模块的相对路径,如果读者使用了其他路径,需要将其修改成本机的模块路径。执行完命令后,会在工程根目录生成一个go.work文件,内容如下:

go 1.19

use (
./Demo
./ModuleA
./ModuleB
)

其中use指令用于指定模块的路径(相对路径或绝对路径)。现在可以将Demo模块和ModuleA模块的go.mod文件中的replace指令和require指令全部删除了,接下来在Demo目录下执行go run Demo.go文件,就会执行成功,并输出如下内容:

Hello 李宁

Hello Bill

如果想关闭工作区模式,可以使用workfile命令行参数,如下所示:

go run -workfile=off Demo.go

go build -workfile=off Demo

3. 设置全局模块名

可能细心的读者会发现一个问题,使用go.work的use指令,模块路径问题是解决了,但还有一个问题没解决,那就是模块名问题,如果修改模块名(如改变了模块名的网址),仍然需要修改大量的源代码。为了解决这个问题,可以在go.work文件中使用replace指令为模块名起一个别名,例如,可以将go.work文件改成如下的内容:

go 1.19

use (
./Demo
./ModuleA
)

replace MA v1.2.3 => ./ModuleA
replace MB v1.2.3 => ./ModuleB

其中MA是MobileA的别名,MB是MobuleB的别名,目前这两个别名都指向本地模块,在引用MobuleA和MobuleB时,就可以直接使用MA和MB了,代码如下:

Demo.go文件的代码:

package main

import (
“fmt”
“MA”
“MB”
)
func main() {
ModuleA.OutputMsg(“李宁”)
fmt.Println(ModuleB.Greet(“Bill”))
}

如果使用了replace指令,use指令中对应模块的路径可以去掉了,当然,也可以保留这些路径,如果在use指令中保留了模块路径,那么在引用模块时,既可以使用在模块的go.mod文件中定义的模块名(module xxx中的xxx),也可以使用replace指令为模块起的别名。

在go.work文件中使用replace指令时,需要在每个模块的go.mod文件中使用require指令指定别名和版本号(必须),如果replace指令没有指定版本号,那么谁便指定一个版本号即可,代码如下:

module github.com/unitymarvel/Demo
go 1.19

require MA v1.2.3
require MB v1.2.3

现在执行go run Demo.go,就可以正常运行了。

可能有的同学会问,目前使用了本地模块,那么在开发完本地模块后,要上传到github上,这就需要切换回网址形式的模块名,该如何做呢?其实很简单,只需要修改replace指令即可,如下面的代码将MA模块指向了github.com上对应的网址(这个网址并不存在,本文只是举个例子,读者需要替换成真正存在的网址)。

replace MA => github.com/unitymarvel/ModuleA v1.3.3

现在运行go run Demo.go,会首先从github.com/unitymarvel/ModuleA下载模块的相关代码(只下载一次,下载到GOPATH环境变量指定的第一个路径中),然后再运行。

”=>“左侧的部分可以选择添加版本后,也可以不添加,但右侧的部分如果是网址,必须添加版本号(可以与左侧的版本号不一致),但如果右侧是本地模块的路径,则不能添加版本号,例如,下面的replace指令是错误的:

replace MA => ./ModuleA v1.2.3

注意:如果模块名与用replace指令为模块起的别名暂时相同,也可以先不使用replace指令,如果未来有一天需要改变本地模块路径或将模块指向网络地址,再在go.work文件中使用replace指令也不迟。

4. 在VSCode中使用工作区模式管理Go模块

只需要用VSCode打开Go工程根目录,就可以直接使用工作区模式管理Go模块了,但如果修改某个配置,可能要稍微等一下才能生效,因为Go语言的LSP需要时间来处理,当配置文件(go.work、go.mod等)有错误时,LSP可能会出错,这时VSCode的智能编辑器可能会无法正确列出对象中的成员。要查看LSP到底是哪里出错了,可以在设置中搜索Use Language Server,然后找到Go: Use Language Server项,如下图所示。去掉前面的复选框,再重新选中前面的复选框,会看到重新启动Go LSP的输出日志。

如果未显示启动日志,可以在VSCode的右下方的视图菜单中选择gopls(server),如下图所示。

日志信息类似下面的内容:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。*

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-kX97SQbW-1713202923960)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值