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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
28天前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
37 4
|
1月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
1月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
33 0
|
3月前
|
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`,以及它们的基本用法和功能。
87 6
|
3月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
70 3
|
3月前
|
Go
Golang语言基于GOPATH方式管理包(package)
这篇文章详细介绍了Golang语言中基于GOPATH方式管理包(package)的方法,包括包的概述、定义、引入格式、别名使用、匿名引入,以及如何快速入门自定义包,并通过具体代码案例展示了包的环境准备、代码编写、细节说明和程序运行。
44 3
【Go语言入门100题】002 打印沙漏 (20 分) Go语言|Golang
L1-002 打印沙漏 (20 分) Go语言|Golang 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
122 0
|
19天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
31 7
|
18天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。