话说胖虎最近招了一个实习生,实习生进来也有一段时间了,天天一个人坐在工位,很少跟周围的同事交流,也不知道有没有遇到什么问题。

胖虎决定主动出击,简单了解下实习生最近的学习情况,也关心一下工作是否顺利

什么是GOROOT

胖虎:来了有几天了,我来验收一下学习的情况吧。先说说什么是 GOROOT 吧

实习生笑道:这个简单啊, 简直就是送分题啊,学长, GOROOT 是环境变量,它的值是 Golang 安装包路径

胖虎内心os:这又不是面试造火箭,肯定不会为难你啊。要是面试问这个问题,算我输。

什么是GOPATH

胖虎:那 GOPATH 呢?

实习生:GOPATH 是Golang 1.5版本之前一个重要的环境变量配置,是存放 Golang 项目代码的文件路径。

如何查看 GOPATH 路径

实习生:在命令控制台输入

go env GOPATH

或者输入:

go env | grep GOPATH

进入GOPATH目录,查看该目录下的所有文件。

go
├── bin
├── pkg
└── src├── github.com├── golang.org├── google.golang.org....

可以看到有三个文件夹。

  • bin 存放编译生成的二进制文件。比如 执行命令 go get github.com/google/gops,bin目录会生成 gops 的二进制文件。

  • pkg 其中pkg下面以下三个文件夹。

    • XX_amd64: 其中 XX 是目标操作系统,比如 mac 系统对应的是darwin_amd64, linux 系统对应的是 linux_amd64,存放的是.a结尾的文件。
    • mod: 当开启go Modules 模式下,go get命令缓存下依赖包存放的位置
    • sumdb: go get命令缓存下载的checksum数据存放的位置

  • src 存放golang项目代码的位置

因此在使用 GOPATH 模式下,我们需要将应用代码存放在固定的$GOPATH/src目录下,并且如果执行go get来拉取外部依赖会自动下载并安装到$GOPATH目录下。

简单来说,GOPATH模式下,项目代码不能想放哪里就放哪里,哪怕你的学习资料盘满了也不行。

GOPATH 的缺点

胖虎:除了需要指定目录,还有哪些缺点吗?

实习生:除了必须指定目录,还是以下三大罪状。

  • go get 命令的时候,无法指定获取的版本
  • 引用第三方项目的时候,无法处理v1、v2、v3等不同版本的引用问题,因为在GOPATH 模式下项目路径都是 github.com/foo/project
  • 无法同步一致第三方版本号,在运行 Go 应用程序的时候,无法保证其它人与所期望依赖的第三方库是相同的版本。

为什么需要Go Modules

实习生:难道就没有解决办法了吗?我墙裂要求官方,实现存放项目路径自由和不同版本的管理。

胖虎:哈哈,不要着急啊,在go 1.11 官方出手了推出了 Go Modules, 通过设置环境变量 GO111MODULE 进行开启或者关闭 go mod 模式。

  • auto 自动模式,当项目根目录有 go.mod 文件,启用 Go modules
  • off 关闭 go mod 模式
  • on 开启go mod 模式

开启 go mod 模式后,你的项目代码想放哪里就放哪里,你想引用哪个版本就用哪个版本,你的地盘,你做主。妈妈再也不用担心你的F盘磁盘空间不够用了。

GOPROXY

实习生:学长,我发现一个问题啊,那就是 github 上面有的包下载不下来,是怎么回事呢?

胖虎:作为开发者基本上都会用到 github 上面的开源仓库,因网络问题,导致有些包是无法下载下来的。不过不用担心,太阳底下无新鲜事,已经现成的Go 镜像站点帮你获取。

环境变量 GOPROXY 就是设置 Go 模块代理的,其作用直接通过镜像站点来快速拉取所需项目代码。

常见代理配置

  • 阿里云

    https://mirrors.aliyun.com/goproxy/

  • 七牛云

    https://goproxy.cn,direct

执行命令:

go env -w GOPROXY="https://goproxy.cn,direct"

初始化Modules

实习生:go mod 既然这么好,那应该怎么使用 go mod 呢?快教教我吧。

基于 go1.17.3 版本

胖虎: 咳咳,学长教学时间开始了,新创建一个空目录test_mod,进入该目录,执行命令

//test_mod 为项目名称
go mod int test_mod

会在根目录生成一个 go.mod 文件,内容如下:

module test_modgo 1.17

如果想引入第三方网络包,在该项目目录执行 go get 仓库地址。比如引入定时任务:

go get github.com/robfig/cron/v3

go.mod 会变成为, indirect 代表是间接依赖,因为当前项目是空的,所以并没有发现这个模块的明确引用。

module test_modgo 1.17require github.com/robfig/cron/v3 v3.0.1 // indirect

并且也会新增一个go.sum文件, 它的作用是保证项目所依赖的模块版本,不会被篡改。

github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=

注意此时,我们的项目是没有任何go代码文件的,现在只有 go.mod 和 go.sum 两个文件。

go mod tidy

如果我们 go.mod 导入了第三方包,但项目代码中我不用,就是玩。领导发现后,不小心一个 go mod tidy 命令,直接把你回到解放前。

观察 go.mod 会发现已经没有了这串神秘代码

require github.com/robfig/cron/v3 v3.0.1 // indirect

机智的你,可能已经猜到了,go mod tidy 就是去掉go.mod文件中项目不需要的依赖。

go mod edit

实习生:如果引入的开源项目的源代码,别人删除了怎么办呢?

自己本地新开发项目代码,还没有推送到远程仓库,其他项目要引用怎么办?

胖虎:不要慌,学长有两个锦囊妙计供你使用,你可按照自己喜好按需使用。

方法1

执行命令:

go mod edit -replace [old git package]@[version]=[new git package]@[version]

例如:

go mod edit -replace github.com/bndr/gojenkins=github.com/Bpazy/gojenkins@latest

执行后 ,会发现 go.mod 文件最后有一串神秘代码

replace github.com/bndr/gojenkins => github.com/Bpazy/gojenkins v1.0.2-0.20200708084040-3655c428bba9

方法2

简单粗暴,直接修改go.mod文件,在go.mod文件最后添加以下神秘代码

replace github.com/bndr/gojenkins => github.com/Bpazy/gojenkins v1.0.2-0.20200708084040-3655c428bba9

即可完美解决此问题,replace 还有一个隐藏的秘密,那就是可引入本地项目代码

replace github.com/bndr/gojenkins => ../gojenkins

总结

疑问

胖虎:最后问下你一个问题吧,go.mod 修改了,要提交到项目仓库,那 go.sum 文件要不要一起提交呢?如果不提交会产生什么后果?回答上来今天就让你提前下班。

实习生:……

有愿意帮实习生的大佬吗?

以上是今天跟大家分享的内容,如果这篇文章对你有帮助,辛苦帮忙点个赞,谢谢

一文搞懂GOPATH 与 GO Modules相关推荐

  1. 一文搞懂 Python 的 import 机制

    一.前言 希望能够让读者一文搞懂 Python 的 import 机制 1.什么是 import 机制? 通常来讲,在一段 Python 代码中去执行引用另一个模块中的代码,就需要使用 Python ...

  2. 一文搞懂什么是 PostCSS

    一文搞懂什么是 PostCSS 在 Web 应用开发中,CSS 代码的编写是重要的一部分.CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演 ...

  3. 一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  4. python语言语句快的标记是什么_一文搞懂Python程序语句

    原标题:一文搞懂Python程序语句 程序流 Python 程序中常用的基本数据类型,包括: 内置的数值数据类型 Tuple 容器类型 String 容器类型 List 容器类型 自然的顺序是从页面或 ...

  5. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  6. 一文搞懂HMM(隐马尔可夫模型)-Viterbi algorithm

    ***一文搞懂HMM(隐马尔可夫模型)*** 简单来说,熵是表示物质系统状态的一种度量,用它老表征系统的无序程度.熵越大,系统越无序,意味着系统结构和运动的不确定和无规则:反之,,熵越小,系统越有序, ...

  7. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  8. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass

    本文将对蓝图类UBlueprint的几个UClass成员变量NativeClass.GeneratedClass.BlueprintClass.ParentClass进行比较深入的讲解,看完之后对蓝图 ...

  9. 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下

    B站实操视频更新 跟着拉面学习AWS--EC2, IGW, RT, NAT, SG 简介 长文多图预警,看结论可以直接拖到"总结"部分 本文承接上一篇文章介绍以下 AWS 基础概念 ...

最新文章

  1. win10 mbr下装linux,在Win10下安装Ubuntu 18.04双系统(MBR+Legacy)
  2. UNIX重定向--dup(2)函数
  3. C语言宏与单井号(#)和双井号(##)
  4. WIN10 下 PHP7 中文乱码的解决办法
  5. 初窥JQuery(一)-选择符 【转】
  6. 参加2013中国大数据技术大会(BDTC2013)
  7. Oracle回退不小心drop掉得表
  8. 我的MVVM框架 v3教程——todos例子
  9. Shell之date用法
  10. 游戏文件系统(a11s)
  11. 消除keil编译警告 #1296-D:extended constant initialiser used
  12. Altium Designer入门
  13. 求解:Encountered internal error running command: TypeError: Cannot read property 'toLowerCase' of unde
  14. 《真三国无双5》全人研究完整版
  15. 趣谈win10常用快捷键
  16. Github Markdown 指定图片在光亮或暗黑模式展示
  17. 京东商城总架构师刘海锋:世界上本没有架构,建设的需求多了便有了架构
  18. WIndows 10 MFC 调用放大镜功能
  19. OpenCV实践:去除票据中的红色印章
  20. Windows10 禁用资讯和兴趣

热门文章

  1. java程序员如何成为架构师,快来看鸭~
  2. NodeJS学习资料分享
  3. 谷歌Android 艰难前行
  4. 公链生态周报:BI指数周涨幅超20%,IOST主网账户突破30万 | 链塔智库
  5. 买电脑看那些配置(附带图片轻松理解应用)
  6. Oracle Data Cloud助力Pinterest征战移动市场
  7. 荣耀官网鸿蒙,荣耀继续使用鸿蒙?最缺一部价格合理的旗舰机!
  8. java xms xmx_启动JAVA程序时,参数-Xms及Xmx有什么用
  9. 纯css,div隐藏滚动条,保留鼠标滚动效果
  10. Python 如何爬取女神的照片