参考资料
- https://study.163.com/course/courseMain.htm?courseId=1210171207 李文周Mooc
- https://www.liwenzhou.com/posts/Go/read_gin_sourcecode/#autoid-0-1-3 李文周博客
Gin实例- func main() {
-  r := gin.Default()
-  r.GET("/", func(c *gin.Context) {
-      c.JSON(200, gin.H{
-          "status": "ok",
-      })
-  })
-  err := r.Run(":9090")
-  if err != nil {
-      log.Printf("start server failed, err: %v\n", err)
-  }
- }
 
 
初始化
gin.Defalut()
- // 使用gin.Default()创建的Engine包含一个Logger和Recovery的中间件。
- func Default() *Engine {
-     debugPrintWARNINGDefault()
-     engine := New()
-     engine.Use(Logger(), Recovery())
-     return engine
- }
gin.New()
- // 使用gin.New()创建的Engine不包含任何中间件
- // 默认配置:
- // - RedirectTrailingSlash:  true
- // - RedirectFixedPath:      false
- // - HandleMethodNotAllowed: false
- // - ForwardedByClientIP:    true
- // - UseRawPath:             false
- // - UnescapePathValues:     true
- func New() *Engine {
-     debugPrintWARNINGNew()
-     engine := &Engine{
-         RouterGroup: RouterGroup{
-             Handlers: nil,
-             basePath: "/",
-             root:     true,
-         },
-         FuncMap:                template.FuncMap{},
-         RedirectTrailingSlash:  true,
-         RedirectFixedPath:      false,
-         HandleMethodNotAllowed: false,
-         ForwardedByClientIP:    true,
-         RemoteIPHeaders:        []string{"X-Forwarded-For", "X-Real-IP"},
-         TrustedProxies:         []string{"0.0.0.0/0"},
-         AppEngine:              defaultAppEngine,
-         UseRawPath:             false,
-         RemoveExtraSlash:       false,
-         UnescapePathValues:     true,
-         MaxMultipartMemory:     defaultMultipartMemory,
-         trees:                  make(methodTrees, 0, 9), // 初始化路由树数量(最多9个HTTP方法)
-         delims:                 render.Delims{Left: "{{", Right: "}}"},
-         secureJSONPrefix:       "while(1);",
-     }
-     engine.RouterGroup.engine = engine
-     engine.pool.New = func() interface{} {
-         return engine.allocateContext()
-     }
-     return engine
- }
type Engine
- // Engine是一个gin框架的实例,包括路由、中间件及其他的一些配置
- type Engine struct {
-     RouterGroup
-     // Enables automatic redirection if the current route can't be matched but a
-     // handler for the path with (without) the trailing slash exists.
-     // For example if /foo/ is requested but a route only exists for /foo, the
-     // client is redirected to /foo with http status code 301 for GET requests
-     // and 307 for all other request methods.
-     RedirectTrailingSlash bool
-     // If enabled, the router tries to fix the current request path, if no
-     // handle is registered for it.
-     // First superfluous path elements like ../ or // are removed.
-     // Afterwards the router does a case-insensitive lookup of the cleaned path.
-     // If a handle can be found for this route, the router makes a redirection
-     // to the corrected path with status code 301 for GET requests and 307 for
-     // all other request methods.
-     // For example /FOO and /..//Foo could be redirected to /foo.
-     // RedirectTrailingSlash is independent of this option.
-     RedirectFixedPath bool
-     // If enabled, the router checks if another method is allowed for the
-     // current route, if the current request can not be routed.
-     // If this is the case, the request is answered with 'Method Not Allowed'
-     // and HTTP status code 405.
-     // If no other Method is allowed, the request is delegated to the NotFound
-     // handler.
-     HandleMethodNotAllowed bool
-     // If enabled, client IP will be parsed from the request's headers that
-     // match those stored at `(*gin.Engine).RemoteIPHeaders`. If no IP was
-     // fetched, it falls back to the IP obtained from
-     // `(*gin.Context).Request.RemoteAddr`.
-     ForwardedByClientIP bool
-     // List of headers used to obtain the client IP when
-     // `(*gin.Engine).ForwardedByClientIP` is `true` and
-     // `(*gin.Context).Request.RemoteAddr` is matched by at least one of the
-     // network origins of `(*gin.Engine).TrustedProxies`.
-     RemoteIPHeaders []string
-     // List of network origins (IPv4 addresses, IPv4 CIDRs, IPv6 addresses or
-     // IPv6 CIDRs) from which to trust request's headers that contain
-     // alternative client IP when `(*gin.Engine).ForwardedByClientIP` is
-     // `true`.
-     TrustedProxies []string
-     // #726 #755 If enabled, it will trust some headers starting with
-     // 'X-AppEngine...' for better integration with that PaaS.
-     AppEngine bool
-     // If enabled, the url.RawPath will be used to find parameters.
-     UseRawPath bool
-     // If true, the path value will be unescaped.
-     // If UseRawPath is false (by default), the UnescapePathValues effectively is true,
-     // as url.Path gonna be used, which is already unescaped.
-     UnescapePathValues bool
-     // Value of 'maxMemory' param that is given to http.Request's ParseMultipartForm
-     // method call.
-     MaxMultipartMemory int64
-     // RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes.
-     // See the PR #1817 and issue #1644
-     RemoveExtraSlash bool
-     delims           render.Delims
-     secureJSONPrefix string
-     HTMLRender       render.HTMLRender
-     FuncMap          template.FuncMap
-     allNoRoute       HandlersChain
-     allNoMethod      HandlersChain
-     noRoute          HandlersChain
-     noMethod         HandlersChain
-     pool             sync.Pool
-     trees            methodTrees // 各类HTTP请求路由树的集合
-     maxParams        uint16
-     trustedCIDRs     []*net.IPNet
- }
- // 确保Engine实现了IRouter接口
- var _ IRouter = &Engine{}
Context
- // Contex是gin中最重要的结构,它使我们能使用中间件,管理流,处理和返回JSON数据
- type Context struct {
-     writermem responseWriter
-     Request   *http.Request
-     Writer    ResponseWriter
-     Params   Params
-     handlers HandlersChain
-     index    int8
-     fullPath string
-     engine *Engine
-     params *Params
-     // This mutex protect Keys map
-     mu sync.RWMutex
-     // Keys is a key/value pair exclusively for the context of each request.
-     Keys map[string]interface{}
-     // Errors is a list of errors attached to all the handlers/middlewares who used this context.
-     Errors errorMsgs
-     // Accepted defines a list of manually accepted formats for content negotiation.
-     Accepted []string
-     // queryCache use url.ParseQuery cached the param query result from c.Request.URL.Query()
-     queryCache url.Values
-     // formCache use url.ParseQuery cached PostForm contains the parsed form data from POST, PATCH,
-     // or PUT body parameters.
-     formCache url.Values
-     // SameSite allows a server to define a cookie attribute making it impossible for
-     // the browser to send this cookie along with cross-site requests.
-     sameSite http.SameSite
- }