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.64T=0.91 s (97.2 files/s, 18596.7 lines/s)
-------------------------------------------------------------------------------
Languagefilesblankcommentcode
-------------------------------------------------------------------------------
Go842537236011796
make18063
YAML28047
Protocol Buffers12010
-------------------------------------------------------------------------------
SUM:882555236011916
-------------------------------------------------------------------------------
目录结构说明
目录 | 作用 |
---|---|
根目录 | 整个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 | 测试程序 |
文章开源地址 https://github.com/jincheng9/...
会有一个系列分享Go Web开发的方方面面。
欢迎大家关注公众号:coding进阶,学习更多Go知识。
推荐阅读
- android第三方框架(五)ButterKnife
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- python自定义封装带颜色的logging模块
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- spring|spring boot项目启动websocket
- OC:|OC: WKWebView详解
- Spring|Spring 框架之 AOP 原理剖析已经出炉!!!预定的童鞋可以识别下发二维码去看了
- WKWebview|WKWebview js 调用oc 和oc调用js