在我们做前端时候,很少会有人做需求的时候上去就什么脚手架都不用直接裸写,基本都会找个所谓的框架,比如三大框架:Angular、Vue、React。所以在做Go的时候我们也不会裸写,需要选个Go的框架。
对比了一下,现在盛行的Go框架,选择了Gin。Gin是一个golang的微框架,API比较友好,源码注释文档非常优秀,具有快速灵活,容错方便等特点。其实对于go而言,web框架的依赖要远比Python,Java、PHP要小。自身的net/http足够简单,性能也非常不错。支持命名路径参数和通配符、支持路由分组、支持数据渲染器。
但是在使用这里之前我需要先把Gin框架下载下来,这就涉及到一门语言的另一个重要功能——包管理工具。我们可以把他理解为前端Nodejs的npm,与Nodejs不同的是,Nodejs在刚刚诞生的时候就有npm,但是在Go刚刚出现的时候,想要对go语言包进行管理,只能依赖第三方库实现,比如Vendor,GoVendor,GoDep,Dep,Glide等等,对于初学者来说,真的是选择困难症。
好在最后golang 1.11之后,Go提供了官方包管理工具mod。首要GO111MODULE为默认开启状态,在终端中执行下面两条指令。
export GO11MODULE=on
export GO111MODULE=on
因为大多数情况下,Go的依赖包因为有些原因下载不下来,我们还需要设置代理来加速包的下载,指令如下:
export GOPROXY=https://goproxy.io
至此我们可以理解为跟项目无关的包设置就完成了。相当于Nodejs中npm。设置了一个npm--registry,但是却别在于npm--registry设置的是一个包的下载源头,而GOPROXY设置的是去找源头的通道。
介绍Go语言包管理还要引入一个Go中的概念,叫做GOPATH,可以理解为Nodejs依赖包的安装目录,只不过我们在安装Nodejs依赖的时候(也就是执行npm install的时候)。包会被下载到名字叫做node_modules的文件夹中,在Nodejs项目中引用的第三方模块都会现在到这个文件里,上线的时候也会把这部分第三方依赖推送上线,如下图所示。
而GOPATH 实际上也是做这部分工作,就是Go语言本身需要引入的第三方类库都存在这个文件夹下,我们执行go env查看Go当面环境的时候,是可以看到下图中GOPATH所处位置/User/chenchen/go(我设置的),也就是可以理解为Nodejs中的node_modules目录其实就是,Go中我设置的GOPATH也就是/User/chenchen/go目录,如下图所示。
我们在工作目录下执行go mod init gin_test用mod初始化一个Go项目。可以看到刚刚执行的命令创建了一个叫做gin_test的文件夹,进去gin_test文件夹之后发现有一个叫做go.mod的文件,go.mod就相当于nodejs的package.json。打开文件只有两行代码。一行标识,一行是Go的版本号。这两行代码可以理解为npm的package中的包名称 和 版本号。
然后我们创建一个main.go的文件,里面输入第四讲的HelloWorld代码,然后执行go build,会发现多出了一个叫做gin_test的二进制可执行文件。
当然直接运行他就会打印出下图中展示的HelloWorld,这是另一种Go的执行方式,先编译再执行。如果说第四讲中的go run 相当于 Nodejs 中的npm run 的话。那么Go build就相当于常规Nodejs的npm build指令了。
接下来打开go.mod文件要加入一行依赖代码。因为之前我们在本讲最开始的时候我们说技术选型选择了Go的Gin框架,所以我们这里就在这里输入require github.com/gin-gonic/gin v1.5.0,加载gin的依赖,如下图所示。
这个时候我们再执行一下go build就会发现多出了一个叫做go.sum的文件,如下图。
打开这个文件之后就会看到对应依赖库的下载地址。
其实在执行go build之后,此时此刻这些依赖库已经下载到本地中了,并且存储在本讲最开始的GOPATH路径下。我们进入自己设置的GOPATH也就是/User/chenchen/go文件夹,就可以看到一个叫做pkg的文件夹。进入pkg下的mod/cache/download/github.com中就能找到go.sum文件中描述的依赖文件了,比如go.sum文件中第三行的go-contrib包,就可以在红框文件夹中发现。
至此,本讲已经介绍了包依赖的引入、下载、配置,还介绍了go中的另一种执行方式。第六讲中我们将详细介绍,如何使用在代码中引入Gin搭建一个简单的WebServer。