浏览本文之前,能够先读上一篇文章,对Web框架的外围组件有个理解。

源代码的目录构造

以v1.7.4版本为例,Gin的源码目录构造如下图所示

+---.github|       ISSUE_TEMPLATE.md|       PULL_REQUEST_TEMPLATE.md|       +---binding|       binding.go|       binding_msgpack_test.go|       binding_nomsgpack.go|       binding_test.go|       default_validator.go|       default_validator_test.go|       form.go|       form_mapping.go|       form_mapping_benchmark_test.go|       form_mapping_test.go|       header.go|       json.go|       json_test.go|       msgpack.go|       msgpack_test.go|       multipart_form_mapping.go|       multipart_form_mapping_test.go|       protobuf.go|       query.go|       uri.go|       validate_test.go|       xml.go|       xml_test.go|       yaml.go|       yaml_test.go|       +---examples|       README.md|       +---ginS|       gins.go|       README.md|       +---internal|   +---bytesconv|   |       bytesconv.go|   |       bytesconv_test.go|   |       |   |---json|           json.go|           jsoniter.go|           +---render|       data.go|       html.go|       json.go|       msgpack.go|       protobuf.go|       reader.go|       reader_test.go|       redirect.go|       render.go|       render_msgpack_test.go|       render_test.go|       text.go|       xml.go|       yaml.go|       |---testdata|    +---certificate|    |       cert.pem|    |       key.pem|    |       |    +---protoexample|    |       test.pb.go|    |       test.proto|    |       |    |---template|            hello.tmpl|            raw.tmpl|   .gitignore|   .travis.yml|   auth.go|   AUTHORS.md|   auth_test.go|   BENCHMARKS.md|   benchmarks_test.go|   CHANGELOG.md|   codecov.yml|   CODE_OF_CONDUCT.md|   context.go|   context_appengine.go|   context_test.go|   CONTRIBUTING.md|   debug.go|   debug_test.go|   deprecated.go|   deprecated_test.go|   doc.go|   errors.go|   errors_1.13_test.go|   errors_test.go|   fs.go|   gin.go|   gin_integration_test.go|   gin_test.go|   githubapi_test.go|   go.mod|   go.sum|   LICENSE|   logger.go|   logger_test.go|   Makefile|   middleware_test.go|   mode.go|   mode_test.go|   path.go|   path_test.go|   README.md|   recovery.go|   recovery_test.go|   response_writer.go|   response_writer_test.go|   result.txt|   routergroup.go|   routergroup_test.go|   routes_test.go|   test_helpers.go|   tree.go|   tree_test.go|   utils.go|   utils_test.go|   version.go

应用cloc工具对源码做一个扫描,总共代码行数不到1.2W。

http://cloc.sourceforge.net v 1.64  T=0.91 s (97.2 files/s, 18596.7 lines/s)-------------------------------------------------------------------------------Language                     files          blank        comment           code-------------------------------------------------------------------------------Go                              84           2537           2360          11796make                             1              8              0             63YAML                             2              8              0             47Protocol Buffers                 1              2              0             10-------------------------------------------------------------------------------SUM:                            88           2555           2360          11916-------------------------------------------------------------------------------

目录构造阐明

目录作用
根目录整个Web框架的外围都在根目录上面,包含server, router, middleware。
binding把http request的数据转成Go里自定义的构造体变量,能够不必本人去一一解析http request里的参数,缩小开发工作量。
examples应用Gin的一些代码示例,目前该目录只有一个README.md,具体的例子在Gin Examples这个独自的Repo里。
ginS依赖sync.Once实现了一个单例版本的gin.Engine,目前看来没啥用途,在和作者沟通中,能够先疏忽。
internalGin外部用的函数。在json这个子package里援用了规范库的encoding/json和第三方的json-iterator,在bytesconv这个子package包里实现了零内存调配版本的string和byte切片的相互转换。
render反对将XML、JSON、YAML、ProtoBuf以及HTML数据做渲染,返回给前端可辨认的响应格局。
testdata一些测试数据。

根目录源码阐明

依照源码重要水平排序

源码作用
gin.gogin.Engine的定义和办法实现,Gin的入口程序
context.go
context_appengine.go
gin.Context的定义和办法实现
response_write.go响应数据的解决
routergroup.go
tree.go
路由的具体实现,其中tree.go来源于httprouter,基于radix tree,不应用反射
auth.go
recovery.go
logger.go
中间件,auth.go是http鉴权中间件,recovery.go是程序panic捕捉中间件,logger.go是日志中间件
mode.goGin服务启动模式的初始化治理,反对debug, release和test这3种模式
debug.gomode.go开启debug模式时,打印一些调试信息
fs.go和动态文件拜访相干的辅助代码,次要是给routergroup.go的Static办法用
path.go对url门路做解决的辅助函数
utils.go一些辅助函数
version.go记录以后Gin框架的版本信息
deprecated.go将来要被删掉的办法,目前只有一个BindWith办法。不应该在程序里应用deprecated.go里的办法。
doc.go目前没有理论用处,可疏忽
xx__test.go测试程序

在后续的文章里,会对Gin的每个源代码文件做具体解析。(https://mp.weixin.qq.com/s/An...)

文章开源地址

https://github.com/jincheng9/...
会有一个系列分享Go Web开发的方方面面。

欢送大家关注公众号:coding进阶,学习更多Go常识。