我的编程空间,编程开发者的网络收藏夹
学习永远不晚

解析Golang中的GoPath和GoModule

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

解析Golang中的GoPath和GoModule

GoModule无法下载国外的依赖包问题
在Golang中,有两个概念非常容易弄错,第一个就是GoPath,第二个则是GoModule,很多初学者不清楚这两者之间的关系,也就难以清晰地了解项目的整体结构,自然也就难以编写结构清晰的代码。

什么是GoPath?

什么是Gopath?在我的上一篇博客Golang环境安装&IDEA开发Golang中,曾经提到过GoPath的概念。
GoPath是Golang的工作空间,所有的Go文件,都需要放在GoPath下的class="lazy" data-src目录下才能够编译运行,所以我提议不要直接配置全局的GoPath目录,否则会非常难以管理所有的Golang项目。

但是在另一篇博客Golang连接MySQL数据库之CRUD中,我也提到过,我们在项目中使用第三方类库的时候,可以使用go get命令从网下直接拉去第三方类库的包,而拉取下来的包就会直接下载到我们的GoPath目录下的class="lazy" data-src包下。

这样就导致了一个问题,我们自己的Golang代码,和第三方的Golang文件混在了一起,这对于我们管理Golang项目的包显然是非常麻烦的,而且每个如果项目都需要同样的依赖,那么我们就会在不同的GoPath的class="lazy" data-src中下载大量重复的第三方依赖包,这同样会占用大量的磁盘空间。

我们给不同的项目设置不同的GoPath,优点非常明显:

便于管理项目,每个项目都是不同的GoPath,这对于我们管理多个Golang项目而言,能够非常清晰的处理项目结构。如果我们把所有项目都放在同一个GoPath的class="lazy" data-src包下,那么项目的结构就会变得非常混乱,难以管理。

但是当我们需要依赖第三方的包的时候,不同的项目设置不同的GoPath的缺点也非常明显:

第三方依赖的包和我们自己的Golang包混在一起,会给我们的项目文件管理带来一定的麻烦。
不同的GoPath都需要下载依赖,那么磁盘中重复的依赖就会非常多,会占用我们大量的磁盘空间。
所以,究竟是设置一个GoPath目录,解决依赖重复的问题,还是设置不同的GoPath目录,解决Golang项目结构混乱的问题,这是一个有争议性的问题。

为了解决这所有的问题,Golang最终引入了GoModule的概念。

什么是GoModule?

GoModule是Golang在1.11版本初步引入的概念,在1.12版本中正是开始使用,所以如果需要使用GoModule,那么需要保证你的Golang的版本在1.12或以上。
另外需要说一下,Golang1.11和1.12版本虽然已经引入了GoModule的概念,但是GoModule是默认不开启的,如果需要开启,那么需要配置一个环境变量:GO111MODULE=on,默认是off。

而在Golang1.13及以上的版本中,GoModule的默认配置为auto,即GoModule会通过你的目录下是否有go.mod文件来判断是否开启GoModule。所以Golang1.13+的版本中我们就不需要配置GO111MODULE属性了。
所以如果你使用GoModule,那么就直接使用Golang1.13+的版本好了!

那么究竟什么是GoModule?

其实说得直白一下,GoModule就是一个用来取代GoPath的Golang的工作空间。
我们之前说过,所有的Golang的文件,都需要放在GoPath目录下才能进行正确的编译和运行,而有了GoModule之后,那么我们就可以把文件放在GoModule目录下,而放在GoModule目录下的Golang文件,也可以正确地编译运行。

那么我们有了GoModule之后,GoPath是不是就可以被舍弃了?

不是的!

我们之前说过,GoPath所引出的问题,就是因为第三方类库的包所导致的,所以我们在有了GoModule之后,GoPath和GoModule就分别负责不同的职责,共同为我们的Golang项目服务。

GoPath我们用来存放我们从网上拉取的第三方依赖包。
GoModule我们用来存放我们自己的Golang项目文件,当我们自己的项目需要依赖第三方的包的时候,我们通过GoModule目录下的一个go.mod文件来引用GoPath目录class="lazy" data-src包下的第三方依赖即可。

这样依赖,既解决了原来只能局限在GoPath目录class="lazy" data-src包下进行编程的问题,也解决了第三方依赖包难以管理和重复依赖占用磁盘空间的问题。

总而言之,在引入GoModule之后,我们不会直接在GoPath目录进行编程,而是把GoPath作为一个第三方依赖包的仓库,我们真正的工作空间在GoModule目录下。

GoModule的设置

既然搞清楚了GoPath和GoModule之间的区别,那么GoModule又该怎么配置呢?一个目录怎么才能算是一个GoModule目录了。

很简单,我们直接使用go mod init 模块名称命令对目录进行初始化操作,即可将这个目录设置为GoModule目录。
我们在F:\GoModule目录下创建一个文件夹,名字为:go_module。
然后通过cmd命令提示符进入该目录,执行go mod init 模块名称初始化命令。

当初始化命令执行完毕之后,会在go_module目录下生成一个go.mod文件,该文件就是用来引入GoPath目录下的第三方依赖的文件。

初始化之后的go.mod文件

module go_module

go 1.14

当我们需要引入GoPath目录下的第三方依赖包的时候,只需要在go.mod目录下添加依赖名称,GoModule就会自动帮我们把第三方依赖包下载到GoPath目录下。

例如下面的go.mod文件:

我们在这个go.mod文件中引入了两个依赖,分别是:beego框架 v1.12.1版本和mysql驱动 v1.5.0版本。

而如果我们使用IDE进行开发的话,那么可以直接创建一个GoModule项目,这样的话IDE会自动帮我们生成所需要的文件,而且在使用依赖的包的时候,IDE还会自动帮我们加入依赖和下载依赖,这会省去我们大量的时间,而且可以不用再去记忆依赖的具体包名和版本号。
GoModule无法下载国外的依赖包问题
这是一个很多开发者都碰到过的问题,对于国外的依赖包无法直接通过网络进行下载,这显然会让开发者非常难受,所以Golang也引入了另一个属性:GOPROXY,我们只需要在环境变量中配置GOPROXY=https://goproxy.io即可解决GoModule无法下载国外的依赖包问题。
当然,也可以通过IDE来配置,这样省的在电脑系统的环境变量配置太多难以管理。

在IDEA中配置GOPROXY属性:

原文链接:https://blog.csdn.net/qq_45193304/article/details/105491864

到此这篇关于解析Golang中的GoPath和GoModule的文章就介绍到这了,更多相关Golang中的GoPath和GoModule内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

解析Golang中的GoPath和GoModule

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Golang中的GoPath和GoModule是什么

这篇文章将为大家详细讲解有关Golang中的GoPath和GoModule是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。GoModule无法下载国外的依赖包问题在Golang中,有两个概念非常容易弄
2023-06-29

golang中GOPATH GOROOT的作用是什么

这期内容当中小编将会给大家带来有关golang中GOPATH GOROOT的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。golang适合做什么golang可以做服务器端开发,但golang很适
2023-06-14

GoPath模式和GoMoudle模式的示例分析

小编给大家分享一下GoPath模式和GoMoudle模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go moudle的前世今生前世-gopathgo
2023-06-14

Golang中struct{}和struct{}{}的区别解析

这篇文章主要介绍了Golang中struct{}和struct{}{}的区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-19

Golang中println和fmt.Println区别解析

Golang中打印数据通常使用fmt.Println()方法,也可以使用内置的println()方法。这两个方法大家可能都使用过,它们的区别是什么呢?本文给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
2023-03-21

Golang token的生成和解析详解

Golang令牌生成与解析详解Golang令牌用于验证用户身份,生成和解析令牌是安全开发的关键。生成令牌:使用github.com/golang-jwt/jwt库。创建jwt.Token结构并设置声明。使用密钥签名令牌以确保完整性和真实性。解析令牌:使用github.com/golang-jwt/jwt库。提供令牌字符串和验证密钥。解析后可获取令牌声明和信息。最佳实践:使用强签名密钥。设置令牌过期时间。通过HTTPS传输令牌。定期吊销和轮换令牌。
Golang token的生成和解析详解
2024-04-02

深入解析Golang中锁的原理和应用

Golang中锁的原理及应用解析引言在并发编程中,常常会遇到多个 goroutine 同时访问共享资源的情况,一旦多个 goroutine 同时对共享资源进行读写操作,可能导致数据不一致性或者产生竞态条件。为了解决这个问题,Golang 提
深入解析Golang中锁的原理和应用
2023-12-28

Go语言和Golang的区别解析

Go语言和Golang常被人们混淆,实际上它们指代的是同一种编程语言。Go是一种由Google开发的编译型语言,因为其官方网站的域名是golang.org,因此在开发者间形成了一种俗称“Golang”的约定俗成的说法。简单来说,Go语言和G
Go语言和Golang的区别解析
2024-02-27

深入解析Golang中接口的定义和作用

Golang中接口的定义和作用详解引言Golang是一门现代化的编程语言,它通过接口实现了面向对象编程的特性。在Golang中,接口是一种定义行为的方法集合,是一种约定,用于指定对象的行为。接口的定义和使用在Golang中非常重要,本文
深入解析Golang中接口的定义和作用
2024-01-24

解析Golang中断言的作用和使用方法

Golang断言的作用及使用方法解析在Golang中,断言(assertion)是一种将接口值转换为具体类型的操作。断言通常用于在运行时确定接口值是否实现了特定的接口或具体类型,并根据判断结果来执行相应的逻辑处理。断言的主要作用是在类型
解析Golang中断言的作用和使用方法
2024-01-29

go语言中GOPATH GOROOT的作用和设置方式

GOPATH 和 GOROOT 不同于其他语言,go中没有项目的说法,只有包, 其中有两个重要的路径,GOROOT 和 GOPATH GOROOT是安装目录,GOPATH是我们的工作空间, 用来存放包的目录GOPATH可以设置多个,其中,第
2022-06-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录