![625f3011a964801e3acad11affe4216a.png](https://i-blog.csdnimg.cn/blog_migrate/b98cc9c60cb9498c0ca45c1183ba0952.jpeg)
在我们做前端的时候,很少会有人做需求的时候上去就什么脚手架都不用直接裸写,基本都会找个所谓的框架,比如三大框架:Angular、Vue、React。写Nodejs的时候,可能会使用Express、Egg、Koa所以在做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项目中引用的第三方模块都会现在到这个文件里,上线的时候也会把这部分第三方依赖推送上线,如下图所示。
![ad37be15fad3b1e63b6f7bde7349b11c.png](https://i-blog.csdnimg.cn/blog_migrate/523b669c56592bea146853cc50cd228b.jpeg)
而GOPATH 实际上也是做这部分工作,就是Go语言本身需要引入的第三方类库都存在这个文件夹下,我们执行go env查看Go当面环境的时候,是可以看到下图中GOPATH所处位置/User/chenchen/go(我设置的),可以理解为Nodejs中的node_modules目录其实就是,Go中我设置的GOPATH也就是/User/chenchen/go目录,如下图所示。
![ffeaf1cd2aaee6b3e9e932fc80a3b529.png](https://i-blog.csdnimg.cn/blog_migrate/0f41fccd4f09141870b24e611c00cc56.jpeg)
我们在工作目录下执行go mod init gin_test用mod初始化一个Go项目。可以看到刚刚执行的命令创建了一个叫做gin_test的文件夹,进去gin_test文件夹之后发现有一个叫做go.mod的文件,go.mod就相当于nodejs的package.json。打开文件只有两行代码。一行标识,一行是Go的版本号。这两行代码可以理解为npm的package中的包名称 和 版本号。
![9f4fc95841747f3e9963789b353383e6.png](https://i-blog.csdnimg.cn/blog_migrate/353c33181426093f4cbfd9cdf54aeddb.png)
![4ea46f2a880ab8c68f72c9dcdb04d356.png](https://i-blog.csdnimg.cn/blog_migrate/671a83feb8abe93436bf0a5c921818aa.jpeg)
然后我们创建一个main.go的文件,里面输入第四讲的HelloWorld代码,然后执行go build,会发现多出了一个叫做gin_test的二进制可执行文件。
![2861efca9008658a6c5189f776477fda.png](https://i-blog.csdnimg.cn/blog_migrate/ee3019b284d4dc1efef430a45b1c959e.jpeg)
当然直接运行他就会打印出下图中展示的HelloWorld,这是另一种Go的执行方式,先编译再执行。如果说第四讲中的go run 相当于 Nodejs 中的npm run 的话。那么Go build就相当于常规Nodejs的npm build指令了。
![310dd759daffd21112d7fe1ec6ffd4ee.png](https://i-blog.csdnimg.cn/blog_migrate/9703306e6d79becabcbf7894204087e6.jpeg)
如果要在Go项目中引入Gin需要打开go.mod文件,并且加入一行Gin依赖代码。因为之前我们在本讲最开始的时候我们说技术选型选择了Go的Gin框架,所以我们这里就在这里输入require http://github.com/gin-gonic/gin v1.5.0,用来加载Gin的依赖,如下图所示。
![64c771e175a675a88f76540563306d9a.png](https://i-blog.csdnimg.cn/blog_migrate/9e3ed538609f994183b2d8d1929ae60b.jpeg)
这时我们再执行一下go build就会发现多出了一个叫做go.sum的文件,如下图。
![b9e42ff129cab1e5b6c33e1244084fa8.png](https://i-blog.csdnimg.cn/blog_migrate/f480ed21c645d29caa988d6b3baa3df3.jpeg)
打开这个文件之后就会看到对应依赖库的下载地址。
![26c2d732e40bfaea57bd14ac3fc74278.png](https://i-blog.csdnimg.cn/blog_migrate/f7df34f0a1924113d2fb20ce5eb65fd9.jpeg)
其实在执行go build之后,此时此刻这些依赖库已经下载到本地中了,并且存储在本讲最开始的GOPATH路径下。我们进入自己设置的GOPATH也就是/User/chenchen/go文件夹,就可以看到一个叫做pkg的文件夹。进入pkg下的mod/cache/download/http://github.com中就能找到go.sum文件中描述的依赖文件了,比如go.sum文件中第三行的go-contrib包,就可以在红框文件夹中发现。
![4c73f9d7cf93c4aaff93402bcb97118a.png](https://i-blog.csdnimg.cn/blog_migrate/8b08600b407ec04298fa0e9ee2407850.jpeg)
至此,本讲已经介绍了包依赖的引入、下载、配置,还介绍了go中的另一种执行方式。第六讲中我们将详细介绍,如何使用在代码中引入Gin搭建一个简单的WebServer。
在最后补充一点,提问中有人问Go的全局提供包和自定义包冲突时候是否跟Nodejs一样。因为Go的全局模块应用均不带路径,带路径的均是自定义包。如果出现在项目跟路径下引入一个fmt.go的包,并且在main.go中引入fmt.go的话,在项目build阶段就会报错。结果如下:
![0d360150a3b0a05b854b60a3a3bd7556.png](https://i-blog.csdnimg.cn/blog_migrate/8772158a93cb87982a525af4c3186c19.jpeg)
陈辰(CC老师) 978563552@qq.com