关于golang:Go-Web框架Gin源码结构解析

浏览本文之前,能够先读上一篇文章,对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          11796
make                             1              8              0             63
YAML                             2              8              0             47
Protocol 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常识。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理