当前位置: 首页 > 面试题库 >

http.HandleFunc模式中的通配符

薛博艺
2023-03-14
问题内容

在Go(语言)中注册处理程序时,是否可以在模式中指定通配符?

例如:

http.HandleFunc("/groups/*/people", peopleInGroupHandler)

其中*可以是任何有效的URL字符串。还是唯一的解决方案是/groups从处理程序(peopleInGroupHandler函数内部匹配并找出其余部分?


问题答案:

http.Handler和http.HandleFunc的模式不是正则表达式或glob。无法指定通配符。它们记录在这里。

也就是说,创建自己的可以使用正则表达式或所需的任何其他模式的处理程序并不难。这是一个使用正则表达式(已编译,但未经测试)的表达式:

type route struct {
    pattern *regexp.Regexp
    handler http.Handler
}

type RegexpHandler struct {
    routes []*route
}

func (h *RegexpHandler) Handler(pattern *regexp.Regexp, handler http.Handler) {
    h.routes = append(h.routes, &route{pattern, handler})
}

func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp, handler func(http.ResponseWriter, *http.Request)) {
    h.routes = append(h.routes, &route{pattern, http.HandlerFunc(handler)})
}

func (h *RegexpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    for _, route := range h.routes {
        if route.pattern.MatchString(r.URL.Path) {
            route.handler.ServeHTTP(w, r)
            return
        }
    }
    // no pattern matched; send 404 response
    http.NotFound(w, r)
}


 类似资料:
  • 问题内容: 我正在尝试使用Log4j2的新RoutingAppender路由基于MDC(Log4j2中的ThreadContext)的不同日志。我想做的是以下几点: 如果MDC映射具有$ contextId->追加到$ contextId附加器(特定日志) 如果MDC没有$ contextId->追加到主附加程序(常规日志) 我想使用标记中的通配符模式来实现此目的,然后使用for contextI

  • 我正在尝试使用Log4j2的新RoutingAppender来基于MDC(Log4j2中的ThreadContext)路由不同的日志。我想做的是以下几点: null 我希望使用标记中的通配符模式来实现这一点,然后使用for contextId(${ctx:contextId})中的key参数进行筛选,并使用main appender的默认值(没有key参数),但是我不知道哪个值是通配符。 任何帮助

  • 使用apache ivy,我想下载jcs 1.3 jar文件,但我不想要它附带的其他暂时依赖项。我是否可以指定ivy来排除这个特定依赖元素的所有暂时依赖项?或者至少在排除模式中使用通配符? 我查找了Ivy文档,没有找到任何关于如何使用matcher for glob/regex模式排除文件的例子。 以下是我ivy.xml的片段,我想避免排除名称/模块的长列表。

  • 问题内容: 在使用hibernate时,我们将遵循Hibernate Doc中提到的通用Hibernate DAO模式。 因此,据此,我们目前为接口2)维护两个并行的层次结构1)以实现 因此,即使我们在标准持久性方法之外没有提出任何新方法的情况下以这种方式进行工作,我们也需要为该对象及其实现创建标记界面。 尽管这种方法及其明确的分隔似乎没有问题。 我的问题是是否有更好的方法/替代方法来实现这一目标

  • 问题内容: 我有以下输入, 我想提取所有输入, 除了 包含“ ”的行和包含单个(点)的最后一行。也就是说,我想提取以下内容 我尝试了以下方法 但它不起作用,因为它不会产生任何输出。 问题答案: 实际操作: 别忘了负前瞻,否则您将无法获得任何匹配;-)

  • 我正在编写一个Rust程序来收集每个输入行的第一个字,这有点类似于Unix实用程序。 这让我 我读过《不能作为可变借来》一书,因为它也是作为不可变借来的,但我仍然感到困惑:可变借来发生在第10行,而不可变借来发生在第12行,那么“已经作为不可变借来的变量是作为可变借来的”怎么可能发生呢?至少错误应该是“一个已经作为可变(在第10行)借用的变量被作为不可变(在第12行)借用”。