当前位置: 首页 > news >正文

GoModule

GOPATH
最早的就是GOPATH构建模式,
go get下载的包都在path中的src目录下
src目录是源代码存放目录。

package mainimport ("net/http""github.com/gorilla/mux"
)func main() {r := mux.NewRouter()r.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("Hello, world!"))}).Methods("GET")http.ListenAndServe(":8080", r)
}

上面的例子中,因为还没有下载github这个,所以导致报错,
因为从我们默认的GOPATH下找不到这个依赖的包,所以编译失败。
但是go get就可以下载依赖包,但是此时下载是最新的,如果后续更新引入了不兼容代码,那么将会无法编译成功。

Go Vendor

Go Module
第一步,使用go mod int创建go.mod文件,将当前项目变成一个Go Module;

第二步,通过 go mod tidy 命令自动更新当前第三方依赖

第三步,执行go build编译,构建可执行程序

module testgo 1.23.0require github.com/gorilla/mux v1.8.1 // indirect

刚才的go get一下github地址,就可以自动更新go module到go.mod

效果:
在这里插入图片描述
在go.mod文件中,我们看到require中依赖的版本号是v1.8.1。
其实,在Go Module模式下,语义版本号主要由三部分组成,
主版本号(major)、次版本号(minor)和补丁版本号(patch),
例如上面的版本号v1.8.1,

主版本号就是1, 次版本号就是8, 补丁版本号就是1。

主版本号不同的两个版本是相互不兼容的,
而且在主版本号相同的情况下,
次版本号大都是向前兼容次版本号小的版本的,
补丁版本也不影响兼容性。

所以:如果某一天mux包发布了v2.0.0版本,那么这时候主版本就是2,已经与v1.8.1和v1.7.1的主版本号不同了,那么v2.0.0与v1.8.1和v1.7.1就是不兼容的包版本。

Go Module常见操作
1.添加第三方依赖包:
为了操作redis,发送kafka消息等等需要导入第三方依赖包。

package mainimport ("net/http""github.com/google/uuid""github.com/gorilla/mux"
)func main() {r := mux.NewRouter()r.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte(uuid.NewString()))}).Methods("GET")http.ListenAndServe(":8080", r)
}

上述代码中,我们还没有下载uuid这个包
所以我们要go get一下这个包,如下所示。(也可以go mod tidy,而且go mod tidy效率更加高)
在这里插入图片描述2.升降级第三方依赖包:
在项目开发中,如果升级了某个包的版本且新版本的包存在一些问题,比如对服务的整体性能产生了影响,我们可以手动的将它降级为之前发布的某个兼容版本。

go list -m -versions github.com/google/uuid//查看包有哪些版本

降级的话:

go get github.com/google/uuid@v1.5.0

在这里插入图片描述降级成功如上图所示。
除了用go get来降级,也可以用go mod tidy来降级依赖包
但是首先要使用go mod edit明确告知依赖的版本

$ go mod edit -require=github.com/google/uuid@v1.4.0
$ go mod tidy

移除第三方依赖包
直接使用go mod tidy自动分析不需要的就可以直接移除。

面试题:

你知道Go构建模式演进过程吗?
说下GOPATH的构建原理?说下GO Vendor的构建原理?
GOPATH有什么缺点?Go Module有什么缺点?
如果导入的第三方依赖包版本不兼容该怎么处理?
Go最小依赖版本选择你知道吗?说下原理?
你觉得当前的Go Module构建模式有什么缺点?该如何改进?

http://www.lryc.cn/news/428544.html

相关文章:

  • SQL - 数据库管理
  • 密码学之AES算法
  • GitHub每日最火火火项目(8.20)
  • (五)Flink Sink 数据输出
  • Spring 注入、注解及相关概念补充
  • 【Linux多线程】线程安全的单例模式
  • 基于jqury和canvas画板技术五子棋游戏设计与实现(论文+源码)_kaic
  • 指针 (四)
  • 便利店(超市)管理系统设计与实现(源码+lw+部署文档+讲解等)
  • Excel中的“块”操作
  • yolo V8训练 长条状目标
  • 数据结构与算法 - 设计
  • 62 网络设备的暗藏的操控者SNMP
  • 华硕飞行堡垒键盘全部失灵【除电源键】
  • 前端字符串将其分割成长度为 32 的子字符串数组
  • 小学二年级数学精选试题
  • 练习题 - 探索正则表达式re功能
  • 【Oracle 11G 配置使用教程1】
  • 【ubuntu24.04】docker pull 配置
  • 《机器学习》—— 通过下采样方法实现银行贷款分类问题
  • Synchronized重量级锁原理和实战(五)
  • linux常用网络工具汇总三
  • Linux中nano编辑器详解
  • 26-vector arraylist和linkedlist的区别
  • 20-redis穿透击穿雪崩
  • Docker使用教程
  • poi-tl循环放图片+文字说明
  • 数据结构之树的存储结构
  • Zotero 常用插件介绍
  • WebSocket协议解析