本文主要分享GIN框架安装使用与踩坑。
1. Gin 特性
快速:路由不使用反射,基于Radix树,内存占用少。
中间件:HTTP请求,可先经过一系列中间件处理,例如:Logger,Authorization,GZIP等。这个特性和 NodeJs 的 Koa 框架很像。中间件机制也极大地提高了框架的可扩展性。
异常处理:服务始终可用,不会宕机。Gin 可以捕获 panic,并恢复。而且有极为便利的机制处理HTTP请求过程中发生的错误。
JSON:Gin可以解析并验证请求的JSON。这个特性对Restful API的开发尤其有用。
路由分组:例如将需要授权和不需要授权的API分组,不同版本的API分组。而且分组可嵌套,且性能不受影响。
渲染内置:原生支持JSON,XML和HTML的渲染。
2. 安装,参考网上的教程
1
go get -u -v github.com/ramya-rao-a/go-outline
提示
1
2
3
github . com / ramya - rao - a / go - outline ( download )
created GOPATH =/ Users / kayoon / go ; see 'go help gopath'
package golang . org / x / tools / go / buildutil : unrecognized import path "golang.org/x/tools/go/buildutil" ( https fetch : Get https : // golang . org / x / tools / go / buildutil ? go - get = 1 : dial tcp 142.251 . 42.241 : 443 : i / o timeout )
看情况是被墙了,开了代理,重新试了一下,正常下载
3. 安装完毕
电脑是mac,去用户目录/User/用户名/,看了下多了一个文件夹“go”,里面有/src/github.com/,包含了gin框架的一些组件
1
2
3
4
5
6
7
8
( base) \u @\h \w \[\]\[\]\[\] $ cd github.com
( base) \u @\h \w \[\]\[\]\[\] $ ll
total 0
drwxr-xr-x 3 kayoon staff 102B 4 28 11:49 gin-contrib
drwxr-xr-x 3 kayoon staff 102B 4 28 11:49 gin-gonic
drwxr-xr-x 3 kayoon staff 102B 4 28 11:50 go-playground
drwxr-xr-x 2 kayoon staff 68B 4 28 11:51 leodido
drwxr-xr-x 3 kayoon staff 102B 4 28 11:08 ramya-rao-a
4. 创建测试项目
1
2
3
mkdir gotest
cd gotest
vim gintest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main () {
//1.创建路由
r := gin . Default ()
//2.绑定路由规则,执行的函数
r . GET ( "/" , func ( context * gin . Context ) {
context . String ( http . StatusOK , "Hello World!" )
})
//3.监听端口,默认8080
r . Run ( ":8080" )
}
5. 尝试运行
1
2
go run gintest . go
# gintest . go : 5 : 8 : no required module provides package github . com / gin - gonic / gin : working directory is not part of a module
看了下是没有正常加载包,网上提到可以通过go mod来管理,我用的是1.16版本的go,module默认是开启的
1.13以下版本需要手动开启
1
2
go env -w GO111MODULE="on"
go env -w GOPROXY="https://goproxy.io"
1
2
3
4
go mod init
go: creating new go.mod: module testproject
go: to add module requirements and sums:
go mod tidy
当前目录生成了go.mod文件
1
go mod edit -require github.com/gin-gonic/gin@latest # 解决,指定Gin的版本
1
2
3
go mod tidy #引用项目需要的依赖增加到go.mod文件。去掉go.mod文件中项目不需要的依赖。
go: errors parsing go.mod:
/Users/kayoon/go/src/testproject/go.mod:5: require github.com/gin-gonic/gin: Get "https://proxy.golang.org/github.com/gin-gonic/gin/@v/list": dial tcp 142.251.43.17:443: i/o timeout
看起来还是代理的问题,直接切换阿里源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
go env - w GOPROXY = https : // mirrors . aliyun . com / goproxy / , direct
go mod tidy
# 执行结果
go : downloading github . com / gin - gonic / gin v1 . 7.7
go : downloading github . com / mattn / go - isatty v0 . 0.12
go : downloading github . com / gin - contrib / sse v0 . 1.0
go : downloading github . com / golang / protobuf v1 . 3.3
go : downloading github . com / stretchr / testify v1 . 4.0
go : downloading github . com / json - iterator / go v1 . 1.9
go : downloading github . com / ugorji / go v1 . 1.7
go : downloading gopkg . in / yaml . v2 v2 . 2.8
go : downloading github . com / ugorji / go / codec v1 . 1.7
go : downloading github . com / go - playground / validator / v10 v10 . 4.1
go : downloading golang . org / x / sys v0 . 0.0 - 20200116001909 - b77594299b42
go : downloading gopkg . in / check . v1 v0 . 0.0 - 20161208181325 - 20 d25e280405
go : downloading github . com / pmezard / go - difflib v1 . 0.0
go : downloading github . com / davecgh / go - spew v1 . 1.1
go : downloading github . com / modern - go / concurrent v0 . 0.0 - 20180228061459 - e0a39a4cb421
go : downloading github . com / modern - go / reflect2 v0 . 0.0 - 20180701023420 - 4 b7aa43c6742
go : downloading golang . org / x / crypto v0 . 0.0 - 20200622213623 - 75 b288015ac9
go : downloading github . com / go - playground / universal - translator v0 . 17.0
go : downloading github . com / leodido / go - urn v1 . 2.0
go : downloading github . com / go - playground / assert / v2 v2 . 0.1
go : downloading github . com / go - playground / locales v0 . 13.0
6. 启动成功
1
2
3
4
5
6
7
8
9
10
11
12
13
go run firstgin . go
[ GIN - debug ] [ WARNING ] Creating an Engine instance with the Logger and Recovery middleware already attached .
[ GIN - debug ] [ WARNING ] Running in "debug" mode . Switch to "release" mode in production .
- using env : export GIN_MODE = release
- using code : gin . SetMode ( gin . ReleaseMode )
[ GIN - debug ] GET / --> main . main . func1 ( 3 handlers )
[ GIN - debug ] [ WARNING ] You trusted all proxies , this is NOT safe . We recommend you to set a value .
Please check https : // pkg . go . dev / github . com / gin - gonic / gin #readme-don-t-trust-all-proxies for details.
[ GIN - debug ] Listening and serving HTTP on : 8080
[ GIN ] 2022 / 04 / 28 - 16 : 01 : 11 | 200 | 74.362 µ s | 127.0 . 0.1 | GET "/"
[ GIN ] 2022 / 04 / 28 - 16 : 01 : 11 | 404 | 531 ns | 127.0 . 0.1 | GET "/favicon.ico"