学习golang(9) 初探:go path与go mod

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 学习golang(9) 初探:go path与go mod

go提供了2种包管理方式,一种是go path还有一种便是go mod

linux 使用 export可以设置环境变量,例如:export GO111MODULE="on"




为什么需要包管理

在使用go过程中,不仅需要使用系统提供的包,例如: fmtnetlog等,我们还需要第三方包,例如: redis-go驱动github.com/go-redis/redis/v8、mysql驱动github.com/go-sql-driver/mysql ,如何快速有效的导入并且使用这些第三方包,这就是为什么需要包管理。



go root


为什么需要go root


我们在安装完go后,需要设置go root路径,当我们使用go提供的系统库的时候,我们可以直接import即可,无需安装,我们可以通过go env来查看go root设置,例如:

image.png


导入系统库案例

当我们程序使用导入系统库,例如: fmt的时候,其实会先到go root中进行寻找,例如,如下程序

image.png



我们import fmt 其实该库的绝对路径为/usr/local/go/src/fmt/print.go

image.png

由于我们设置了go root,它会替我们寻找而已

go为了导入第三方库,给我们提供了2个工具,分别为 go pathgo mod


我们从如下例子来讲go pathgo mod

  1. go pathgo mod设置
  2. 引入本地依赖库
  3. 引入网络库




go path


go path 设置

我们也可以通过go env来获得,例如

image.png

我们可以第三方插件放置到go path目录下,然后引用即可



引入本地依赖


例如,我们新建一个新文件

路径: /root/go/src/github.com/pdudo/hello.go

内容

image.png


我们再主函数中引用该包函数Start

image.png


运行一下

image.png


若未找到包,则会报如下错误

image.png

报错意思为: 程序引用了该包,但是在go rootgo path均未找到。



下载网络依赖

若我们引用了网络库,例如: redis-go

我们代码如下


image.png


在执行的时候,会报错

image.png


提示找不到github.com/go-redis/redis/v8,我们只需要通过go get即可进行下载


image.png


我们通过查看gopath来看redis

image.png


这个代表下载好了,甚至于你可以通过这个命令来下载该库cd .; git clone -- https://github.com/go-redis/redis /root/go/src/github.com/go-redis/redis

最终目的只有一个,那就是将库放在go path下即可。



缺点


  • 使用go get,如遇网络问题,拉取过程较为复杂
  • 自己编写的包,和网络上的第三方包,都放置在go path中,容易造成混乱,不方便管理
  • 如果程序中导入了多个第三方包,第三方包又嵌套了第三方包,在go get的时候,往往会很困难。
  • 使用go get,版本无法缺点,为应对该问题,往往需要设置多个目录



go mod

gov1.11推出了go modules包管理工具,以应对go path出现的问题。


go mod设置


GO111MODULE

go env中有个环境变量: GO111MODULE,该值来控制go mod,其参数值为

  • off

go不启用go modules功能,采取的是go path方法来寻包。

  • on

go启用go modules,若设置为on,则不会寻找go path路径了

  • auto

该值较为特殊,是因为要根据当前目录环境来决定是否使用go modules



若出现如下情况,则会使用go mod

-   项目目录不在`go path`下
-   当前或者上一级目录存在`go.mod`文件



GOPROXY

在一些网络较为特殊的环境下,我们若没办法直接访问库地址,我们可以通过代理去镜像拉取

该值有2个参数: goProxyUrl,[off,direct]

若为off: 表示不会回源,即: 当代理拉取不到数据的时候,不会去源站镜像拉取。


若为direct: 表示会回源,当代理拉取不到的时候,会去源站尝试拉取

GOPRIVATE

和上面go env 变量 GOPROXY呈现反效果,这里设置的是,不走proxy的私有仓库或者项目。

设置类似于: GOPRIVATE=git.mycompany.com,github.com/my/private

我们测试设置如下

image.png



下载网络依赖库

我们可以使用go mod init mod_name来创建一个go mod

其中mod_name可以不写,然后使用go mod tidy进行拉取资源

image.png


我们运行下程序

image.png

现在报的是连接不上redis, 而非找不到库了。



引入本地依赖库

使用go mod拉取网络库非常爽,但是引入个人库就比较麻烦了

例如,我们自己编写了一个flags代码

image.png


我们想引用它,

我们先创建go mod

注意哟,这里如果要调用flags库的函数,flags也需要创建go mod 才行

go mod init

我们则需要修改一下go.mod文件

修改如下

image.png


我们编写主函数

image.png


我们执行下代码

image.png


我们发现,代码执行成功了。

go.mod含义

image.png




总结


不管是go path也好,还是go module也罢,找到自己合适的才是最好的,额, 不过,好像后续go版本计划废除go path,也不知道是不是真的,不过go mod相比对go path而言的话,上手较慢,需要有一个学习过程,才能正确引入本地依赖库。




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
缓存 NoSQL Go
通过 SingleFlight 模式学习 Go 并发编程
通过 SingleFlight 模式学习 Go 并发编程
|
1月前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
1月前
|
Go
golang语言之go常用命令
这篇文章列出了常用的Go语言命令,如`go run`、`go install`、`go build`、`go help`、`go get`、`go mod`、`go test`、`go tool`、`go vet`、`go fmt`、`go doc`、`go version`和`go env`,以及它们的基本用法和功能。
32 6
|
1月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
36 3
|
2月前
|
Unix 编译器 Go
|
1月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
2月前
|
Go 开发者
|
2月前
|
IDE Go 开发工具
Go Error module declares its path as but was required as解决方案
文章提供了一个解决方案,用于处理在Go工程中将依赖的仓库从A更换为B(即使它们完全相同)时遇到的路径声明错误,建议通过发布新版本来解决此问题。
49 0
|
5月前
|
JSON JavaScript Go
Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析
掌握 Go 语言的常见概念,如变量、循环、条件语句、函数、数据类型等等。深入了解 Go 基础知识的好起点是查阅 Go 官方文档
928 2
|
12月前
|
自然语言处理 Java Go
Go语言学习之函数
Go语言学习之函数
30 0