【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

相关文章
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
111 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
66 4
Golang语言文件操作快速入门篇
|
15天前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
15天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
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`,以及它们的基本用法和功能。
53 6
|
2月前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
36 5
|
2月前
|
Go
Golang语言之切片(slice)快速入门篇
这篇文章是关于Go语言中切片(slice)的快速入门教程,详细介绍了切片的概念、定义方式、遍历、扩容机制、使用注意事项以及相关练习题。
31 5
|
2月前
|
Go
Golang语言之数组(array)快速入门篇
这篇文章是关于Go语言中数组的详细教程,包括数组的定义、遍历、注意事项、多维数组的使用以及相关练习题。
33 5
|
2月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
47 3
|
3月前
|
Go 开发者