扩展知识:
go mod
类似于我们 Python 的 pip 做依赖管理的,每个项目可能都会使用一些外部包,外步包有很多版本
- go mod就是帮助我们自动管理你们的包和版本号的
- 如果没有go mod别人如何才能运行你们的代码
外部的包:其他人封装好的,实现特定功能的代码
1. 介绍
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
fmt.Println(gin.Version)
// 1.创建 (实例化gin.Engine结构体对象)
g := gin.Default()
// 2.绑定路由规则,执行的函数
//gin.Context,封装了request和response,之后的请求和响应直接使用context就可以实现
g.GET("/", func(context *gin.Context) {
context.String(http.StatusOK, "hello world")
})
// 3.监听端口,默认在8080
//Run("里面不指定端口号默认为8080")
g.Run()
}
gin.Default会去new一个gin的实例,然后再去Use中间件。
之后去注册路由的时候将路由加入到路由树里面。
最后r.run其实就是调用了http.ListenAndServe(":8081", nil)
首先会去看看有没有中间件,如果有它会先去处理中间件,其实也就是实际处理路由之前需要处理的。其实也就是放了一个全局的拦截器,过滤器。先要处理完发过来的信息,处理完之后传给下一层。
经过中间件处理完之后会去丢给具体处理的哪个路由,哪个url,匹配到了之后再去处理handler方法。handler里面具体的逻辑就是大家去写,比如是否要去连接数据库。
处理完之后,再去返回给中间件去做一层处理,可能有有可能没有。中间件处理完之后再去将这个结果返回给用户。
总结:接收到消息之后不是立刻路由处理,首先是中间件处理,先过一层中间件,中间件处理完毕之后再到路由,处理完之后再到handler的业务处理逻辑,无论是你去连接redis还是mysql都根据你的需求去写。handler处理完之后再去给中间件去处理。
大部分情况下可能只有一层中间件,返回的时候是不需要的。
// Default返回一个已经附加了Logger和Recovery中间件的Engine实例
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New() // 默认实例,默认实例是不会去注册中间件的
// 注册中间建,中间件的是一个函数,最终只要返回一个 type HandlerFunc func(*Context) 就以
engine.Use(Logger(), Recovery()) //一个是日志中间件和处理Panic的
// 默认注册的两个中间件
return engine
}
2. engine := New() 初始化
func New() *Engine {
debugPrintWARNINGNew()
// Engine 容器对象,整个框架的基础
engine := &Engine{ // 初始化语句
// Handlers 全局中间件组在注册路由时使用
RouterGroup: RouterGroup{ // Engine.RouterGroup,其中的Handlers存储着所有中间件
Handlers: nil, //没有任何处理方法和中间件的,注册路由和注册中间件都是在注册路由之后加上的
basePath: "/",
root: true,
},
// 树结构,保存路由和处理方法的映射,这里会存储9种请求方法对,根据每种请求方法分开
trees: make(methodTrees, 0, 9),
}
engine.RouterGroup.engine = engine return engine //初始化完成之后,它又将初始化实例放到结构体里面了
}