第一天 环境搭建
一、安装、配置Gin
安装好go的SDK后,配置好SDK和GOPATH环境变量后,开始Gin框架的搭建:
按照Gin官网的快速上手,直接使用:
$ go get -u github.com/gin-gonic/gin
发现出现了很多包无法下载的问题,查了资料发现还是代理的问题,还好Golang在Github上已经建立了镜像库,这个开源项目goproxy.io已经实现了我们想要的东西,只需要在命令行执行下面两行配置就行了(其他什么都不需要做):
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
执行以上两行命令后,接下来的go命令将从公共代理镜像中快速拉取之前所缺的依赖代码了,所以这时候重新执行一下“$ go get -u github.com/gin-gonic/gin”,之前缺的包就补上了。
但是,下载到最后还是出现了一个问题:
package io/fs is not in GOROOT
先忽略这个问题,执行以下代码测试Gin框架是否安装成功:
package main
import (
"github.com/gin-gonic/gin"
)
func sayhello(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello go gin!",
})
}
func main() {
r := gin.Default() //默认的路由引擎
r.GET("/hello", sayhello) //get请求访问时执行sayhello
//启动服务
r.Run(":9090")
}
发现报错:
cannot find module providing package github.com/gin-gonic/gin: working directory is not part of a module
接着查呗,发现是因为前面我们通过“go env -w GO111MODULE=on”开启了go mod来管理包路径,导致包管理并非官方所说的在GOPATH\src\,而是去了GOPATH\src\pkg\目录下,此时需要用go mod引入这些包,解决import获取不了包的问题,也就是运行以下两条命令:
go mod init gin
go mod edit -require github.com/gin-gonic/gin@latest
之后再次运行测试项目,之前忽略的错误果然出现了,即“package io/fs is not in GOROOT”,配置环境真的麻烦…
没办法接着找呗,错误原因是:io/fs只在golang 1.16及以上版本才支持,而我使用的golang版本是1.15.6,网上给出的意见是升级golang版本,但是,在实际生产中,一般是不能轻易升级所使用语言的版本的,所以尽量考虑不升级golang版本的解决方案:
也就是在go.mod中,将gin的版本改为v1.6.3,此时go.mod中的代码为:
module gin
go 1.15
require github.com/gin-gonic/gin v1.6.3
最后,再次运行测试代码,测试成功:
二、热加载
像Python的Flask框架,有debug模式,启动时传入debug=true就可以热加载了(即更改源码并保存后,自动触发更新,浏览器上刷新即可,免去了杀进程、重新启动之苦)。Gin原生不支持热加载,但是有很多额外的库可以支持,如:
github.com/codegangsta/gin
github.com/pilu/fresh
我使用fresh:
go get -v -u github.com/pilu/fresh
按照网上的教程,执行完上述命令后直接执行fresh就可以了,但是我运行fresh会提示fresh不是一个命令,然后我发现fresh.exe是自动安装在了GOPATH/bin文件夹下,跳到该文件夹下运行fresh.exe时,又会提示没有main这个package(有main package才怪,main package在别的文件夹下),网上找了半天,找到了一种有效的解决方案,就是在终端运行以下命令(哪个文件夹下打开的终端都可以,我是在自己的GOPATH文件夹下):
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
然后定位到项目所在的文件夹,输入“fresh”,就开始热加载了: