是什么

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 目录下,在命令行下执行如下命令:

  1. PS D:\Projects\Github\NoobWu\go-gin-example> go get -u github.com/gin-gonic/gin

image.png

go.sum

这时候你再检查一下该目录下,会发现多个了个 go.sum 文件,如下:
D:\Projects\Github\NoobWu\go-gin-example\go.sum
image.png
go.sum 文件详细罗列了当前项目直接或间接依赖的所有模块版本,并写明了那些模块版本的 SHA-256 哈希值以备 Go 在今后的操作中保证项目所依赖的那些模块版本不会被篡改。

go.mod

既然我们下载了依赖包,go.mod 文件会不会有所改变呢,我们再去看看,如下:
D:\Projects\Github\NoobWu\go-gin-example\go.mod
image.png
确确实实发生了改变,那多出来的东西又是什么呢,go.mod 文件又保存了什么信息呢,实际上 go.mod 文件是启用了 Go modules 的项目所必须的最重要的文件,因为它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module:用于定义当前项目的模块路径。
  • go:用于设置预期的 Go 版本。
  • require:用于设置一个特定的模块版本。
  • exclude:用于从使用中排除一个特定的模块版本。
  • replace:用于将一个模块版本替换为另外一个模块版本。

你可能还会疑惑 indirect 是什么东西,indirect 的意思是传递依赖,也就是非直接依赖。

测试

编写一个test.go文件

  1. package main
  2. import "github.com/gin-gonic/gin"
  3. func main() {
  4. r := gin.Default()
  5. r.GET("/ping", func(c *gin.Context) {
  6. c.JSON(200, gin.H{
  7. "message": "pong",
  8. })
  9. })
  10. r.Run() // listen and serve on 0.0.0.0:8080
  11. }

执行 test.go

  1. PS D:\Projects\Github\NoobWu\go-gin-example> go run .\test.go

image.png
访问 $HOST:8080/ping,若返回{“message”:”pong”}则正确

  1. PS C:\Users\Administrator> Invoke-WebRequest -Uri "http://127.0.0.1:8080/ping" -UseBasicParsing

image.png
至此,我们的环境安装和初步运行都基本完成了。
image.png

再想一想

刚刚在执行了命令 $ go get -u github.com/gin-gonic/gin 后,我们查看了 go.mod 文件,如下:

  1. module github.com/EDDYCJY/go-gin-example
  2. go 1.17
  3. require (
  4. github.com/gin-contrib/sse v0.1.0 // indirect
  5. github.com/gin-gonic/gin v1.7.4 // indirect
  6. github.com/go-playground/locales v0.14.0 // indirect
  7. github.com/go-playground/universal-translator v0.18.0 // indirect
  8. github.com/go-playground/validator/v10 v10.9.0 // indirect
  9. github.com/golang/protobuf v1.5.2 // indirect
  10. github.com/json-iterator/go v1.1.12 // indirect
  11. github.com/leodido/go-urn v1.2.1 // indirect
  12. github.com/mattn/go-isatty v0.0.14 // indirect
  13. github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
  14. github.com/modern-go/reflect2 v1.0.2 // indirect
  15. github.com/ugorji/go/codec v1.2.6 // indirect
  16. golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
  17. golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 // indirect
  18. golang.org/x/text v0.3.7 // indirect
  19. google.golang.org/protobuf v1.27.1 // indirect
  20. gopkg.in/yaml.v2 v2.4.0 // indirect
  21. )

你会发现 go.mod 里的 github.com/gin-gonic/gin 是 indirect 模式,这显然不对啊,因为我们的应用程序已经实际的编写了 gin server 代码了,我就想把它调对,怎么办呢,在应用根目录下执行如下命令:

  1. PS D:\Projects\Github\NoobWu\go-gin-example> go mod tidy

该命令主要的作用是整理现有的依赖,非常的常用,执行后 go.mod 文件内容为:

  1. module github.com/EDDYCJY/go-gin-example
  2. go 1.17
  3. require github.com/gin-gonic/gin v1.7.4

image.png
可以看到 github.com/gin-gonic/gin 已经变成了直接依赖,调整完毕。

参考

本系列示例代码


原文链接

https://eddycjy.com/posts/go/gin/2018-02-10-install/