浏览本文之前,能够先读上一篇文章,对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,目前看来没啥用途,在和作者沟通中,能够先疏忽。 |
internal | Gin外部用的函数。在json这个子package里援用了规范库的encoding/json和第三方的json-iterator,在bytesconv这个子package包里实现了零内存调配版本的string和byte切片的相互转换。 |
render | 反对将XML、JSON、YAML、ProtoBuf以及HTML数据做渲染,返回给前端可辨认的响应格局。 |
testdata | 一些测试数据。 |
根目录源码阐明
依照源码重要水平排序
源码 | 作用 |
---|---|
gin.go | gin.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.go | Gin服务启动模式的初始化治理,反对debug, release和test这3种模式 |
debug.go | mode.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常识。