【Golang 快速入门】Go Modules + 生态拓展

简介: Go modules 是 Go 语言的依赖解决⽅案,本文对它做了比较详细的的介绍。同时介绍了 Go 语言的生态及各种库。

Go Modules

Go modules 是 Go 语言的依赖解决⽅案。

发布于 Go1.11,成⻓于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使⽤。

Go modules 集成在Go 的工具链中,只要安装了 Go 就可以使用,它解决了以下几个问题:

  1. Go 语言长久以来的依赖管理问题。
  2. “淘汰” 现有的 GOPATH 的使用模式。
  3. 统一社区中其他的依赖管理工具(提供依赖迁移功能)。

GO PATH 的弊端:

  • 无版本控制概念
  • 无法同步一致第三方版本号
  • 无法指定当前项⽬引用的第三⽅版本号

go mod 命令

命令 作用
go mod init 生成 go.mod 文件
go mod download 下载 go.mod 文件中指明的所有依赖
go mod tidy 整理现有的依赖
go mod graph 查看现有的依赖结构
go mod edit 编辑 go.mod 文件
go mod vendor 导出项目所有的依赖到 vendor 目录
got mod verify 检验一个模块是否被篡改过
go mod why 查看为什么需要依赖某模块

go mod 环境变量

通过 go env 命令进行查看:

$ go env
GO111MODULE="auto"
GOPROXY="https://goproxy.cn,direct"
GONOPROXY=""
GOSUMDB="sum.golang.org"
GONOSUMDB=""
GOPRIVATE=""
...

GO111MODULE

GO111MODULE 表示是否开启 Go modules 模式,允许设置以下参数:

  • auto:项目包含了 go.mod 文件就启用 Go Modules。
  • on:启用 Go modules ,推荐设置。
  • off:禁用 Go modules,不推荐。

建议 go v1.11 后,都设置为 on:go env -w GO111MODULE=on

GOPROXY

GOPROXY 用于设置 Go 模块代理,用于使 Go 在拉取版本模块时通过镜像站点来快速拉取。

建议设置为国内的地址:

go env -w GOPROXY=https://goproxy.cn,direct
direct 用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等)

GOSUMDB

GOSUMDB 用于检验拉取的第三方库是否完整。

默认值是 sum.golang.org(国内无法访问),但是如果设置了 GOPROXY 默认就会被代理。

GOPRIVATE

GOPRIVATE 环境变量的值也将作为 GONOPROXY 和 GONOSUMDB 的默认值。

这三个环境变量都是用于公司依赖了私有模块,需要设置,否则会拉取失败。

使用示例:

设置 git.example.com 和 github.com/aceld/zinx 是私有仓库,不会进行 GOPROXY 下载和检验

go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx

设置 example.com 的子域名,比如 git.example.com、hello.example.com,都不进行 GOPROXY 下载和检验

go env -w GOPRIVATE="*.example.com"

初始化项目

使用 go mod 创建项目,不强制要求在 $GOPATH/src 目录下进行。

创建 go.mod 文件,同时为当前项目的模块命名:(以后别人通过这个名字导入你的模块)

go mod init github.com/yusael/modules_test

会生成一个 go.mod 文件:

module github.com/yusael/modules_test

go 1.17

在项目中编写源代码,如果依赖了某个库(比如: github.com/aceld/zinx/znet)

可以手动下载 go get github.com/aceld/zinx/znet,也可以自动下载

下载后 go.mod 文件中会添加一行新代码:

  • 含义是当前模块依赖 github.com/aceld/zinx
  • 依赖的版本是 v1.0.1
  • // indirect 表示间接依赖
module github.com/yusael/modules_test

go 1.17

require github.com/aceld/zinx v1.0.1 // indirect

同时项目中会生成 go.sum 文件:

  • go.sum 作用:列出当前项目直接或间接依赖的所有模块版本,保证今后项目依赖版本不被篡改。
  • h1:hash 表示对整体项目 zip 文件打开后全部文件的校验和来生成的 hash

    不存在则表示依赖的库可能用不上。
  • xxx/go.mod h1:hash go.mod 文件做的 hash
github.com/aceld/zinx v1.0.1 h1:WnahGyE7tDJvkJRVK2VI/m57aHEeUjr12EAYpOYW3ng=
github.com/aceld/zinx v1.0.1/go.mod h1:Tth0Fmjjpel0G8YjCz0jHdL0sXlc4p3Km/l/srvqqKo=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=

修改项目版本依赖关系

go mod edit -replace=xxx@v1.0.1=xxx@v1.0.4

以上命令将 xxx@v1.0.1 的依赖修改为 xxx@v1.0.4 的依赖。

这个一般用不上,用上时请查阅当前的最新资料。

Golang 生态拓展

Web 框架

beego:https://github.com/astaxie/beego

gin:https://github.com/gin-gonic/gin

echo:https://github.com/labstack/echo

lris:https://github.com/kataras/iris

微服务框架

go kit:http://gokit.io/

Istio:https://istio.io/

容器编排

Kubernets:https://github.com/kubernetes/kubernetes

swarm:https://github.com/docker/classicswarm

服务发现

consul:https://github.com/hashicorp/consul

存储引擎

etcd:https://github.com/coreos/etcd

tidb:https://github.com/pingcap/tidb

静态建站

hugo:https://github.com/gohugoio/hugo

中间件

消息队列 nsq:https://github.com/nsqio/nsq

TCP 长连接框架(轻量服务器):https://github.com/aceld/zinx

Leaf(游戏服务器):https://github.com/name5566/leaf

RPC 框架,gRPC:https://grpc.io/

redis 集群:https://github.com/CodisLabs/codis

爬虫框架

go query:https://github.com/PuerkitoBio/goquery

相关文章
|
4月前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
254 4
|
4月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
244 4
|
4月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
277 1
|
7月前
|
人工智能 测试技术 持续交付
Golang深入浅出之-Go语言中的持续集成与持续部署(CI/CD)
持续集成与持续部署(CI/CD)是现代软件开发的关键实践,尤其适用于Go语言项目。本文探讨了Go项目中常见的CI/CD问题,如测试覆盖不足、版本不一致和构建时间过长,并提供解决方案及GitHub Actions示例代码,帮助开发者优化流程,提升交付效率和质量。
241 5
|
8月前
|
供应链 安全 Go
Go Modules 详解 -《Go语言实战指南》
Go Modules 是 Go 语言官方推出的依赖管理工具,自 Go 1.11 起引入,Go 1.16 成为默认方式。它解决了第三方依赖版本控制、项目脱离 GOPATH 限制及多模块管理等问题。本文全面讲解了 Go Modules 的基本原理、初始化方法、常用命令(如 `go mod init`、`go get` 等)、依赖管理(添加/升级/删除)、子模块开发以及常见问题排查,帮助开发者高效使用 Go Modules 进行项目管理。
golang快速入门:流程控制
Go 语言的流程控制语句用于设定计算执行次序和逻辑结构,主要包括条件语句(if、else、else if)、分支语句(switch、case、select)、循环语句(for、range)和跳转语句(goto、break、continue)。条件语句无需圆括号,必须使用花括号;分支语句支持多条件合并和跨分支执行;循环语句仅支持 for 关键字,可通过 for-range 遍历集合;跳转语句支持标签结合,改变默认跳转逻辑。灵活组合这些控制语句可实现复杂业务逻辑。
286 16
golang快速入门:流程控制
|
11月前
|
Go 开发者
go-carbon v2.6.0 重大版本更新,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持
238 3
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
300 4
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
424 6
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
265 4

热门文章

最新文章

推荐镜像

更多