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

58次阅读

共计 3356 个字符,预计需要花费 9 分钟才能阅读完成。

浏览本文之前,能够先读上一篇文章,对 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 常识。

正文完
 0