文章目录

  • 什么是GoPath?
  • 什么是GoModule?
  • GoModule的设置
  • GoModule无法下载国外的依赖包问题

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

什么是GoPath?

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

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

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

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

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

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

  1. 第三方依赖的包和我们自己的Golang包混在一起,会给我们的项目文件管理带来一定的麻烦。
  2. 不同的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目录src包下的第三方依赖即可。

这样依赖,既解决了原来只能局限在GoPath目录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
1.14
go

http://www.taodudu.cc/news/show-5345881.html

相关文章:

  • java 加密 c 解密_java处理加密文件---RSA加密和解密
  • java 公匙私匙_Java生成非对称型加密公钥和私钥的方法
  • linux生成私钥 prk,自动生成RSA密钥,并进行加密和解密1
  • 无监督关键短语的生成问题01--综述
  • 拼多多产品轮播图如何设计?
  • 农产品价格数据可视化展示分析(附各省js文件)
  • CSS+JS实现图片集展示(二)
  • 如何实现上传多个图片并依次展示_js前端实现多图图片上传预览的两个方法(推荐)...
  • 11个使用CSS制作产品展示卡片样例
  • php网站制作成品欣赏,phpweb成品网站产品展示模块功能简介
  • 织梦仿产品展示页产品图集调用方法
  • php制作商品展示页面,wordpress如何做产品展示页
  • C# ASP.NET 开源网上商城、外贸产品网上展示的几个效果图 -- 仅供大家参考
  • 用CSS3制作令人印象深刻的产品展示图片切换效果
  • Swiper制作滑动型产品展示图
  • Adapting Object Detectors via Selective Cross-Domain Alignment
  • Adapting learning rate
  • TENER: Adapting Transformer Encoder for Named Entity Recognition
  • 《nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation》2018 未完待续(导师给了别的方向)
  • 论文笔记:Harmonizing Transferability and Discriminability for Adapting Object Detectors
  • 2019 CVPR 刘泓 Transferable Adversarial Training: A General Approach to Adapting Deep Classifiers
  • 论文阅读:Fast-adapting and Privacy-preserving Federated Recommender System
  • [人脸对齐] Structured Landmark Detection via Topology-Adapting Deep Graph Learning
  • 【论文】Closing the Sim-to-Real Loop: Adapting Simulation Randomization with Real World Experience
  • 论文笔记:nnU-Net: Self-adapting Frameworkfor U-Net-Based Medical Image Segmentation
  • Self-supervised Augmentation Consistency for Adapting Semantic Segmentation
  • 论文解读:Adapting Object Detectors via Selective Cross-Domain Alignment
  • 论文笔记:Adapting Object Detectors via Selective Cross-Domain Alignment
  • 元学习论文阅读 | CAD: Co-Adapting Discriminative Features for Improved Few-Shot Classification, CVPR2022
  • CVPR2019领域自适应/语义分割:Adapting Structural Information across Domains for Boosting Sema适应结构信息跨领域促进语义分割

Golang中的GoPath和GoModule相关推荐

  1. golang中使用GOPATH模式和GoModule(gomod)模式的区别

    参考:一文搞懂 Go Modules 前世今生及入门使用 前言 在说他们之间的区别时,我们需要先了解了解GoMoudle的前世今生. 以前,Go 语言的的包依赖管理一直都被大家所诟病,Go官方也在一直 ...

  2. golang中的包管理工具——govendor和godep简单学习

    为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...

  3. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

  4. 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  5. go语言的iota是什么意思_关于Golang中的iota

    快速一览 iota是Golang中提供的一个简化常量和枚举编程的标识符,合理的使用这个标识符可以让代码变得更简洁,省去大量的不必要的代码. 比如下面的这个常量定义 const ( a = 1 b = ...

  6. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  7. golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: test_int, err := strconv.Atoi(test_string) if err != ni ...

  8. golang中并发sync和channel

    golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...

  9. golang中的sync.WaitGroup

    golang中的sync.WaitGroup Posted on 2015/04/09刚才看golang的sync的包,看见一个很有用的功能.就是WaitGroup. 先说说WaitGroup的用途: ...

最新文章

  1. darknet53网络结构及配置文件对比
  2. 继续不务正业,今天来弄弄R
  3. python 编译器重构_Python之父考虑重构Python解释器
  4. sklearn中的fit_transform和transform以及什么时候使用
  5. 震惊!来看《这份程序员面试手册》!!!
  6. AngularJs出现错误Error: [ng:areq]
  7. java判断jd安装,java - 安装和使用 java 反编译应用: jd-compiler ,以及命令行的使用...
  8. 数据库MySQL/mariadb知识点——操作篇(4)数据操作语句
  9. hihocoder-1623-有歧义的号码
  10. c盘哪些文件可以删除_原来C盘可以删除这5个文件,难怪你的电脑越来越卡
  11. 解决iconfont 图标不显示问题
  12. 关于ADS注册表删除和重新安装
  13. 全网最强红黑树的理解和实现
  14. 用自己电脑做网站服务器
  15. 独角兽云发卡系统源码下载
  16. python桌面爬虫_Python爬虫 利用python爬取ZOL桌面壁纸大图
  17. linux drupal 7,在CentOS 7下试验Drupal 7
  18. Android开发笔记(一百八十六)管理SQLite的利器——应用检查器App Inspection
  19. MQ--1( Message queuing)RabbitMQ
  20. 【ArcGIS教程】专题图制作-人口密度分布图——人口密度分析

热门文章

  1. 2022新H5即时通讯聊天系统源码+带群聊/有APP
  2. 非常恶俗地分享一首歌曲(董贞·逍遥游)
  3. linux mint 图标主题_给小白的Linux Mint Xfce扁平化美化攻略
  4. 2022-2028年中国基因工程药物行业发展战略规划及投资方向研究报告
  5. Bzoj4521 [Cqoi2016]手机号码
  6. 向大神们求救,笔记本电脑换了win10系统之后,关机之后电源灯还是亮着的,每次都需要强制关机
  7. 服务器配置要考虑哪些服务器主机配置介绍
  8. 【基础算法】差分的应用(一维差分和二维差分)
  9. iOS学习之iOS沙盒(sandbox)机制和文件操作(一)
  10. seo网站要发外链找哪些平台?