通过项目学习Go语言之go mod

Go 语言在最近几年可谓大放异彩,各大互联网公司的大型系统几乎都能见到 Go 的身影。同时,大家在网上也时常能看到某某公司将原来有 Python 或者 Java 构建的大型系统全部用go语言重构,在提升性能的同时还节省了大量的资源。Go 以其高性能、简单而闻名。Docker、k8s、Etcd 等成功的产品均是 Go 开发的。

在本场 Chat 中,会讲到如下内容:

  • 通过项目学习 Go 语言之环境搭建
  • 通过项目学习 Go 语言之 go mod
  • 通过项目学习 Go 语言之项目介绍
  • 通过项目学习 Go 语言之项目运行
  • 通过项目学习 Go 语言之 log
  • 通过项目学习 Go 语言之 gin context
  • 通过项目学习 Go 语言之请求流程
  • 通过项目学习 Go 语言之 Router 分析
  • 通过项目学习 Go 语言之插件编写

Go 语言的包管理经过了多种工具的演变,上一节中我们通过配置 GOPATH 来存放源代码进行包的管理,其实称不上包管理,在起初开发的时候我们会把我们一个系统依赖的全部源代码下载到 src 目录,当多个 系统依赖不同版本的代码库时,处理起来十分的麻烦。所以,Go 的包管理一致受到开发者的诟病。后来社区出现了几个针对 Go 开发的包管理工具。

从 Godep 包管理工具到 glide,直至 go1.5 版本引入 go vender 机制才有了基本的包管理能力,govender 的引入也是实验性质的,也就是说直至 go1.5 版本都没有出来一个正式的包管理工具。随着 go1.11 的正式发布 go modules 试探性的成为官方认可的包管理工具,在这个版本的发行中正式包含的 go mod 工具包,开始对 go 模块化管理有了初步的支持,不过开发者还需要进行一定的配置才能使用 gomod 工具。

Go modules 是官方推出推荐的 GOPATH 的一个替代方案,同时集成了对版本控制和包分发的支持。随着 go1.11 推出后,还是有很多的问题。官网不断在社区收集开发者反馈的问题,继续进行优化修 bug。到 go1.12 gomod 还是未默认将 gomod 设置为包管理工具取代 GOPATH。在 go1.11 和 go1.12 版本中,因为没有将 gomod 设置为默认包管理方式,增加了一个临时环境变量 GO111MODULE 来控制使用方式。这个环境变量有三种设置方式:off、on、auto

  • off,则 go 命令从不使用 go modules 的功能,在执行 go 命令时将继续在 GOPATH 中查找依赖包,继续使用老的 GOPATH 模式;

  • auto,当 go 源码不在 GOPATH 路径下且当前目录或者上层目录存在 go.mod 文件时,启用 gomod 模式,否则将使用 GOPATH 模式。

  • on,则 go 命令使用 go mod 模式,命令执行过程中将忽略 GOPATH 的设置,按照 gomod 的方式管理 go 程序;

在 gomod 模式下,开发的项目下载的依赖包还是会存储到 GOPATH/pkg/mod 目录下,编译生成的二进制文件也将会存放到 GOPATH/bin/ 目录下。

可以通过 go help modules 命令查看关于 go mod 的更多信息,也可以直接访问 https://github.com/golang/go/wiki/Modules 获取更多信息。

今天我们已经处在了 go1.12、go1.13 的时代了,我们可以毫无顾忌的使用 go modules 了,也不必再纠结选用哪个包管理工具了。也不必去浪费时间学习其他的包管理工具,让我们开始学习 go modules 的使用。

go mod 命令介绍

download 下载依赖的包到本地缓存目录

edit 编辑 go.mod 文件

graph 打印模块输出图

init 初始化 modules 项目

tidy 添加缺失的依赖或者移除未使用的依赖

vendor 生成 vendor 依赖目录

verify 验证依赖是否正确

why 解释为什么需要相关依赖

当项目运行在 go mod 模式下时,执行 go 相关的命令 run build test get 等会下载或者更新项目依赖的包。

使用 go mod 构建项目

目前我们 go 版本是 1.11.13,需要通过两个临时的环境变量设置默认支持 go mod 模式:

export GO111MODULE=onexport GOPROXY=https://goproxy.cn

在这里插入图片描述设置 GOPROXY,是让我们更方面的下载那些由于国内网络原因无法下载的依赖包。

首先,我们创建一个不同于 GOPATH 的目录,用于 gomod 模式项目的开发:

mkdir -p /Users/tl/work/gomodappsmkdir -p github.com/pk3589/modexample/

初始化

go mod init modexample/

因为我们下面分析的项目时以 gin 为基础构建的,所以我们直接以引用 gin 包为例说明,

vi example.go 输入

package mainimport "github.com/gin-gonic/gin"func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")}

执行 go mod tidy,我们看到已经在 gomod 模式下自动下载了项目所依赖的相关包在这里插入图片描述执行 mod 命令执行 go run example.go,启动 web 服务。

在这里插入图片描述启动显示日志打开浏览器访问 http://localhost:8080/ping 响应返回 json 数据 pong在这里插入图片描述访问结果至此,我们已经会使用 go mod 构建项目了。

通过 GoLand 打开我们刚才构建的项目,在这里插入图片描述

多看一点

刚才我们提到,在 gomod 的模式下,项目依赖仍然会下载到 GOPATH 目录下,下面我们看一下我们构建的 modexample 项目下载的依赖是不是在 GOPATH 下,

gomod 项目依赖包执行 go install,在这里插入图片描述生成的二进制执行文件在这里插入图片描述交叉编译,很多时候项目的开发环境是 windows 或者 mac,而我们实际生产环境却是 linux,这时我们就用到的 go 为我们提供的交叉编译功能,只需执行相关的命令就能在我们开发环境生成目标环境的可执行文件:比如生成 linux 环境下的可执行文件

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build example.go

本节完。


本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。

阅读全文: http://gitbook.cn/gitchat/activity/5dedbf401e3fc53e50117999

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值