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构建模式有什么缺点?该如何改进?

相关推荐
不老刘4 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
Tony Bai11 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
念何架构之路13 小时前
Go进阶之panic
开发语言·后端·golang
先跑起来再说13 小时前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
Tony Bai1 天前
“Go 2,请不要发生!”:如果 Go 变成了“缝合怪”,你还会爱它吗?
开发语言·后端·golang
灰子学技术1 天前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
源代码•宸2 天前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
有代理ip3 天前
Python 与 Golang 爬虫的隐藏优势
爬虫·python·golang
天远云服3 天前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang
女王大人万岁3 天前
Go标准库 sync 详解
服务器·开发语言·后端·golang