我需要一个可以支持静态和动态路由的HTTP router "violetear",我的意思是,可以处理请求,例如:

/read/book/:uuid/:uuid/

:uuid类似于C6FF0F6F-A274-48F4-B219-6595DCB989A5

或基本路线如:

/read/page/3

对于中间件,我使用Alice帮助我保持与http.Handler接口的兼容性 .

到目前为止一直很好,直到我需要在中间件之间交换数据或访问命名参数,如前面示例中的 :uuid .

由于路由器用于其他项目,我想继续保持与http.Handler接口的兼容性,因此我决定不将 net/context 作为参数传递给中间件并选择包含在http.ResponseWriter中,如下所示:https://github.com/nbari/violetear/blob/master/response_writer.go#L14 .

基本上这种方法如果我需要使用上下文我必须做的事情:

func handleUUID(w http.ResponseWriter, r *http.Request) {
    cw := w.(*ResponseWriter)
    // add a key-value pair to the context
    cw.Set("key", "my-value")
    // print current value for :uuid
    fmt.Fprintf(w, "Named parameter:, %q", cw.Get(":uuid"))
}

请注意 cw := w.(*ResponseWriter) .

这是有效的,但想知道是否通过执行 type 开关存在任何问题,或者是否有任何问题这样做 .

提前致谢 .