”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在“http.HandleFunc”之外的 Go HTTP 路由中实现通配符支持?

如何在“http.HandleFunc”之外的 Go HTTP 路由中实现通配符支持?

发布于2024-12-22
浏览:513

How to Implement Wildcard Support in Go HTTP Routing Beyond `http.HandleFunc`?

使用自定义处理程序与通配符进行高级处理程序模式匹配

当使用 http.HandleFunc 在 Go 中定义路由模式时,内置机制不提供通配符支持。这可能是捕获动态 URL 组件的限制因素。

具有正则表达式模式匹配的自定义处理程序

要克服此限制,可以创建一个自定义处理程序支持使用正则表达式的灵活模式匹配。这是一个示例:

import (
    "net/http"
    "regexp"
)

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

type RegexpHandler struct {
    routes []*route
}

// Handler adds a route to the custom handler.
func (h *RegexpHandler) Handler(pattern *regexp.Regexp, handler http.Handler) {
    h.routes = append(h.routes, &route{pattern, handler})
}

// HandleFunc adds a function-based route to the custom handler.
func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp, handler func(http.ResponseWriter, *http.Request)) {
    h.routes = append(h.routes, &route{pattern, http.HandlerFunc(handler)})
}

// ServeHTTP iterates through registered routes and checks if any pattern matches the request. If a match is found, the corresponding handler is invoked.
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, return a 404 response.
    http.NotFound(w, r)
}

用法:

自定义处理程序处理具有通配符模式的 URL 的示例用法:

import (
    "log"
    "net/http"
)

func main() {
    rh := &RegexpHandler{}

    // Define a regular expression for capturing any valid URL string.
    pattern := regexp.MustCompile(`/groups/.*/people`)
    rh.HandleFunc(pattern, peopleInGroupHandler)

    // Start the web server and use the custom handler.
    log.Fatal(http.ListenAndServe(":8080", rh))
}

这种方法允许您构建超出 http.HandleFunc 限制的灵活路由模式,同时保持对自定义处理程序中路径匹配逻辑的控制。

最新教程 更多>
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-30
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-04-30
  • Excel UDFs能否修改其他单元格?
    Excel UDFs能否修改其他单元格?
    excel udf:克服数组输出中的限制 与普遍的信念相反,可以通过复杂的解决方法来完成这项任务。通过利用Windows计时器和应用程序的组合。对时间计时器,我们可以绕过这些限制。 windows Timer是从UDF内部启动的。但是,其函数仅限于安排应用程序。一次时计时器。 applicat...
    编程 发布于2025-04-30
  • 用CSS和emoji打造奇趣主题切换
    用CSS和emoji打造奇趣主题切换
    [2 您可以在此处进行检查:https://fictoan.io/ 全是CSS和两行JS,仅用于旋转触发器。我想进入更大的场景,但想立即分享! 您可以在这里发现所有微观详细信息吗? 完整代码: https://github.com/fictoan/fictoan-docs/tree/main/src...
    编程 发布于2025-04-30
  • 猴子补丁能否解决Go不可变代码库的测试难题?
    猴子补丁能否解决Go不可变代码库的测试难题?
    在GO中进行补丁:一个不变的代码bases 面对类似的情况,建议的方法涉及创建自定义界面作为围绕无法解码的代码的包装器创建一个自定义界面。这使您可以在完整的原始代码完整时模拟测试中的特定方法。 int,错误) } 键入混凝土结构{ 客户 *somepackage.client } func(...
    编程 发布于2025-04-30
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-30
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-04-30
  • C++语法到底是上下文无关还是上下文相关,还是更强大的东西?
    C++语法到底是上下文无关还是上下文相关,还是更强大的东西?
    揭示了C的语法:上下文复杂性此外,C模板实例化本身是Turing-complete,可以在解析过程中进行计算。这使得c不合上下文和上下文敏感的分类。在理论上可能是无上下文或上下文敏感的语法,而其难以理解的复杂性使其不切实际。 C标准中对技术英语和算法描述的依赖反映了这种句法不确定性的识别。而不是正...
    编程 发布于2025-04-30
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-30
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-04-30
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-04-30
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-04-30
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-04-30
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-04-30
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-04-30

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3