【问题标题】:Golang echo package middleware implementationGolang echo 包中间件实现
【发布时间】:2019-07-16 19:18:47
【问题描述】:

我正在学习 Go 并且正在经历这个例子:echo middleware example。我想深入了解当我们在函数中间件函数Process() 中调用next(c) 时发生了什么。

查看main() 我知道我们通过Use() 调用将Process() 函数附加到echo Context 对象的中间件函数列表中。但是,查看echo source code,我不确定中间件示例中Process() 函数中的next(c) 调用如何查看上下文的所有中间件函数。即使在搜索源代码后我似乎也找不到一些东西:

(1) echo.HandlerFunc 的函数定义在哪里?我看到WrapHandler,但这是导出的,没有在echo.go 中使用,所以我很困惑当next(c) 被调用echo.go 源代码中我们跳转到的哪一行代码时会发生什么。

(2) 调用applyMiddleware 时似乎发生了循环,因为这似乎循环了保存在 Context 的中间件函数列表中的所有中间件函数,但我看不到该方法是如何调用的,除非你调用导出WrapMiddleware函数或ServeHTTP

【问题讨论】:

  • 如果您指的是特定的源代码,请在问题正文中引用相关代码,而不是外部链接。
  • HandlerFunc 不是一个函数,而是一个 type,这就是为什么它没有函数定义,但是,source code 中有一个类型定义如果你有兴趣。

标签: go middleware go-echo


【解决方案1】:

next(c) 不会循环任何内容。 next 是作为函数参数接收的变量,其中包含函数。 next(c) 调用该函数。在实践中,它是链的下一部分——可能是下一个中间件,也可能是最终的请求处理程序。当Process返回的func被调用时,它本身可能被它之前的中间件调用为next

没有任何魔法,库中也没有隐藏任何东西。它只是一个函数调用链。

【讨论】:

  • 谢谢。我仍然不确定当请求到达/stats 时会发生什么。请求进来,中间件HandlerFuncProcess怎么先调用?然后让我们假设在Process 之后要执行第二个中间件函数。我想知道这个函数调用链是如何工作的。但也许一旦我正确设置了我的 VSCode Go 调试器,我就可以逐步完成它。
  • 路由器(在您的情况下为 gin)调用为路由注册的处理程序。您已将处理程序包装在中间件中,因此中间件是路由器实际调用的内容。然后中间件调用它的参数,以此类推。
猜你喜欢
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 2017-04-02
相关资源
最近更新 更多