为你自己学Go
  • README
  • PART01.Web框架概览
    • 1.01 Web框架概览:学习路线
    • 1.02 Web框架概览-Beego框架分析
    • 1.03 Web框架概览-GIN框架分析
    • 1.04 Web框架概览-Iris框架分析
    • 1.05 Web框架概览-Echo框架分析
  • PART02.Server
    • 2.01 Server详解与面试要点
  • PART03.路由树
    • 3.01 路由树-Beego&GIN&Echo实现与设计总结
    • 3.02 路由树-全静态匹配
    • 3.03 路由树-TDD起步
    • 3.04 路由树-静态匹配测试用例
    • 3.05 路由树-静态匹配之路由查找
    • 3.06 路由树-静态匹配之集成Server
    • 3.07 路由树-通配符匹配之路由注册
    • 3.08 路由树-通配符匹配之路由查找与测试
    • 3.09 路由树-参数路径之基本注册和查找
    • 3.10 路由树-参数路径之校验
    • 3.11 路由树-参数路径之参数值
    • 3.12 路由树-总结与面试要点
  • PART04.课后复习
    • 4.01 课后复习-Server
    • 4.02 课后复习-Route
  • PART05.Context
    • 5.01 Context-简介
    • 5.02 Context-Beego Context设计分析
    • 5.03 Context-Gin Context设计分析
    • 5.04 Context-Echo和Iris的Context设计分析
    • 5.05 Context-处理输入输出总结
    • 5.06 Context-处理输入之Body输入
    • 5.07 Context-处理输入之表单输入
    • 5.08 Context-处理输入之查询参数、路径参数和StringValue
    • 5.09 Context-处理输出
    • 5.10 Context-总结与面试要点
  • PART06.AOP
    • 6.01 AOP简介与不同框架设计概览
    • 6.02 AOP设计方案-Middleware
  • PART07.Middleware
    • 7.01 Middleware-AccessLog
    • 7.02 Middleware-Trace简介和OpenTelemetry
    • 7.03 Middleware-OpenTelemetry测试
    • 7.04 Middleware-OpenTelemetry总结
    • 7.05 Prometheus详解
    • 7.06 Middleware-Prometheus
    • 7.07 Middleware-错误页面
    • 7.08 Middleware-从panic中恢复
    • 7.09 Middleware总结和面试
  • PART08.Review
    • 8.01 课后复习-AOP
    • 8.02 课后复习-Context
    • 8.03 课后复习-Middleware-AccessLog
  • PART09.Appendix
    • 附录1.责任链模式
    • 附录2.生成器模式
    • 附录3.函数选项模式
  • xiaochengxu
    • 01.原力去水印
    • 02.KeePass密码管理:安全轻松的管理您的密码
Powered by GitBook
On this page
  • PART1. Echo Context设计分析
  • 1.1 Echo Context的设计
  • 1.2 Echo 处理输入
  • 1.3 Echo 处理输出
  • PART2. Iris Context设计分析
  • 2.1 Iris Context的设计
  • 2.2 Iris 处理输入
  • 2.3 Iris 处理输出
  1. PART05.Context

5.04 Context-Echo和Iris的Context设计分析

Last updated 9 months ago

PART1. Echo Context设计分析

1.1 Echo Context的设计

Echo的被设计为接口,这一点和Beego、Gin都不太一样,但实际上,它只有1个实现.

这意味着其他人也可以提供Context接口的不同实现,但实际上也并没有什么人去实现它.

从方法定义上来看,Echo的context和Beego、Gin的都差不多,也是维护来自各部分的输入和输出.

context struct {
	request  *http.Request
	response *Response
	path     string
	pnames   []string
	pvalues  []string
	query    url.Values
	handler  HandlerFunc
	store    Map
	echo     *Echo
	logger   Logger
	lock     sync.RWMutex
}
  • context.logger:这意味着Echo把日志输出定义在了context级别上.有一种观点认为日志输出应该定义在Server上,而非Context上

  • context.lock:有一种观点认为Context没有必要实现线程安全.因为正常情况下1个请求打到Server端,就应该只有1个Context去处理这个请求(因为Server端的基本模型是每收到1个请求,就有1个goroutine去处理这个请求,因此应该只有1个Context).如果在中间件使用者定义的HandleFunc内部,中间件使用者自己又启动了一些goroutine,那么应该让中间件使用者自己去在他创建的这些goroutine之间确保这个Context的线程安全,而非由中间件研发者替他对Context的线程安全做出保证

1.2 Echo 处理输入

echo.context中从不同部位读取指定数据的方法

1.3 Echo 处理输出

echo.context中处理各种格式输出的方法.包括渲染页面的方法(context.Render)

PART2. Iris Context设计分析

2.1 Iris Context的设计

这意味着其他人也可以提供Context接口的不同实现,但实际上也并没有什么人去实现它.

从抽象层级上来讲,确实这种设计比Beego和Gin的抽象层级更高.但在这个场景下的前提是:真的需要Context接口的多个实现.很明显这个场景下是没这个需求的.

2.2 Iris 处理输入

context.Context中处理各部分输入的方法

2.3 Iris 处理输出

context.Context中处理各种格式输出的方法

可以看到,和Gin的Context设计一样,Echo的Context也是自行封装了一个,但是使用了原生的http.Request.

Iris的也是设计为接口,也是有一个默认的实现结构体.

注:截止编写笔记的日期(2023.11.15),Iris不再是这种设计,而是直接使用结构体,该结构体实现了多个接口.

Context
context
Response
Context
Context
Context
EchoContext中处理各部分输入的方法
EchoContext中处理各种格式输出的方法
IrisContext中处理各部分输入的方法
IrisContext中处理各种格式输出的方法