GoModule

GOPATH

最早的就是GOPATH构建模式,

go get下载的包都在path中的src目录下

src目录是源代码存放目录。

go 复制代码
package main

import (
	"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编译,构建可执行程序

go 复制代码
module test

go 1.23.0

require 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消息等等需要导入第三方依赖包。

go 复制代码
package main

import (
  "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 复制代码
go list -m -versions github.com/google/uuid//查看包有哪些版本

降级的话:

go 复制代码
go get github.com/google/uuid@v1.5.0

降级成功如上图所示。

除了用go get来降级,也可以用go mod tidy来降级依赖包

但是首先要使用go mod edit明确告知依赖的版本

go 复制代码
$ 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构建模式有什么缺点?该如何改进?

相关推荐
古城小栈1 天前
Go 底层代码的完整分类
开发语言·后端·golang
耳冉鹅1 天前
Go无锁共享内存环形缓冲区设计
开发语言·golang
fy121632 天前
GO 快速升级Go版本
开发语言·redis·golang
童话ing2 天前
【Golang】Golang Map数据结构底层原理
数据结构·golang·哈希算法
GDAL2 天前
go.mod 文件讲解
golang·go.mod
Java面试题总结2 天前
Go图像处理基础: image包深度指南
图像处理·算法·golang
robch3 天前
golang container/heap 是一个为任意类型实现堆(优先队列)接口的包
数据结构·算法·golang
leonkay3 天前
Golang语言闭包完全指南
开发语言·数据结构·后端·算法·架构·golang
echome8883 天前
Go 语言并发编程实战:用 Goroutine 和 Channel 构建高性能任务调度器
开发语言·后端·golang
yuanlaile3 天前
2026后端趋势:Java 老了?Go 才是未来?
java·后端·golang·go与java·后端学什么