【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 在拉取版本模块时通过镜像站点来快速拉取。

默认值是: https://proxy.golang.org,国内无法访问

阿里云:阿里云Go Module代理服务 (aliyun.com)

七牛云:七牛云 - Goproxy.cn

建议设置为国内的地址:

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 开发者
go-carbon v2.3.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。
27 0
|
3月前
|
测试技术 Go 开发者
go-carbon v2.3.7 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。
18 2
|
1月前
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
|
3月前
|
物联网 Go 网络性能优化
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
84 1
|
1月前
|
Go 开发工具 git
编程笔记 GOLANG基础 003 Go语言开发环境搭建
编程笔记 GOLANG基础 003 Go语言开发环境搭建
|
1月前
|
存储 Java Go
编程笔记 GOLANG基础 002 Go语言简介
编程笔记 GOLANG基础 002 Go语言简介
|
3月前
|
NoSQL Go API
Golang使用第三方库Go-Redis操作redis
Golang使用第三方库Go-Redis操作redis
35 0
|
3月前
|
Go 索引
Golang随笔之《Go专家编程》查漏补缺
Golang随笔之《Go专家编程》查漏补缺
39 5
|
3月前
|
安全 应用服务中间件 Linux
百度搜索:蓝易云【CentOS7使用Nginx、Supervisor部署Go/Golang服务教程】
这些是在CentOS 7 x64上使用Nginx和Supervisor部署Go/Golang服务的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
61 0
|
4月前
|
JSON Go 开发者
go-carbon v2.3.0 圣诞特别版发布,轻量级、语义化、对开发者友好的 Golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。
50 0