Go:如何使用中间件模式



我有一个函数,它只在特定条件下执行(例如role == 'Administrator')。现在,我使用'if'语句。但也有可能是在条件数量很多的情况下,长定义的'if'看起来不太美观。
它是否在Go中(或与Go框架相关)允许实现中间件概念(动作过滤器)?

例如,ASP。. NET MVC允许这样做:

[MyFilter]
public ViewResult Index()
{
     // Filter will be applied to this specific action method
}

因此,在单独的类中实现的MyFilter()允许更好的代码组合和测试。

更新:Revel (Go语言的web框架)提供了类似的功能拦截器(由框架在操作调用之前或之后调用的函数):https://revel.github.io/manual/interceptors.html

这种事情通常在Go中使用中间件完成。最简单的例子是:

package main
import (
    "fmt"
    "html"
    "log"
    "net/http"
)
func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/foo", middleware(handler))
    log.Fatal(http.ListenAndServe(":8080", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}
func middleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        r.URL.Path = "/MODIFIED"
        // Run the next handler
        next.ServeHTTP(w, r)
    }
}

正如您所看到的,中间件是一个函数,它:

  1. 接受http.HandlerFunc作为参数;
  2. 返回http.HandlerFunc;
  3. 调用传入的http.handlerFunc

使用这个基本技术,您可以"链接"任意多的中间件:

http.HandleFunc("/foo", another(middleware(handler)))

这个模式有一些变体,大多数Go框架使用稍微不同的语法,但概念通常是相同的。

Revel (Go的web框架)提供了类似的功能
拦截器(由框架在操作调用之前或之后调用的函数)。
这里描述的概念和实现:https://revel.github.io/manual/interceptors.html

最新更新