是什么
Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance – up to 40 times faster. If you need smashing performance, get yourself some Gin.
Gin 是用 Go 开发的一个微框架,类似 Martinier 的 API,重点是小巧、易用、性能好很多,也因为 httprouter 的性能提高了 40 倍。
安装
我们回到刚刚创建的 go-gin-example 目录下,在命令行下执行如下命令:
PS D:\Projects\Github\NoobWu\go-gin-example> go get -u github.com/gin-gonic/gin
go.sum
这时候你再检查一下该目录下,会发现多个了个 go.sum 文件,如下:D:\Projects\Github\NoobWu\go-gin-example\go.sum
go.sum 文件详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go 在今后的操作中保证项目所依赖的那些模块版本不会被篡改。
go.mod
既然我们下载了依赖包,go.mod 文件会不会有所改变呢,我们再去看看,如下:D:\Projects\Github\NoobWu\go-gin-example\go.mod
确确实实发生了改变,那多出来的东西又是什么呢,go.mod 文件又保存了什么信息呢,实际上 go.mod 文件是启用了 Go modules 的项目所必须的最重要的文件,因为它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:
- module:用于定义当前项目的模块路径。
- go:用于设置预期的 Go 版本。
- require:用于设置一个特定的模块版本。
- exclude:用于从使用中排除一个特定的模块版本。
- replace:用于将一个模块版本替换为另外一个模块版本。
你可能还会疑惑 indirect 是什么东西,indirect 的意思是传递依赖,也就是非直接依赖。
测试
编写一个test.go文件
package main
import "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
}
执行 test.go
PS D:\Projects\Github\NoobWu\go-gin-example> go run .\test.go
访问 $HOST:8080/ping,若返回{“message”:”pong”}则正确
PS C:\Users\Administrator> Invoke-WebRequest -Uri "http://127.0.0.1:8080/ping" -UseBasicParsing
至此,我们的环境安装和初步运行都基本完成了。
再想一想
刚刚在执行了命令 $ go get -u github.com/gin-gonic/gin 后,我们查看了 go.mod 文件,如下:
module github.com/EDDYCJY/go-gin-example
go 1.17
require (
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.7.4 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.9.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/ugorji/go/codec v1.2.6 // indirect
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
你会发现 go.mod 里的 github.com/gin-gonic/gin 是 indirect 模式,这显然不对啊,因为我们的应用程序已经实际的编写了 gin server 代码了,我就想把它调对,怎么办呢,在应用根目录下执行如下命令:
PS D:\Projects\Github\NoobWu\go-gin-example> go mod tidy
该命令主要的作用是整理现有的依赖,非常的常用,执行后 go.mod 文件内容为:
module github.com/EDDYCJY/go-gin-example
go 1.17
require github.com/gin-gonic/gin v1.7.4
可以看到 github.com/gin-gonic/gin 已经变成了直接依赖,调整完毕。