南昌优化网站分析,代做ppt,免费seo技术教程视频,贵港做网站化司目录
方法匹配#xff08;Method Matching#xff09;
通配符#xff08;Wildcards#xff09;
路径前缀匹配
优先规则
兼容性
API 变更
小结
参考资料 Go 1.22 版本对 net/http 包的路由功能进行了增强#xff0c;引入了方法匹配#xff08;method matchingMethod Matching
通配符Wildcards
路径前缀匹配
优先规则
兼容性
API 变更
小结
参考资料 Go 1.22 版本对 net/http 包的路由功能进行了增强引入了方法匹配method matching和通配符wildcards两项新功能这些特性使得开发者能够使用模式字符串来表达常见的路由而不需要直接编写 Go 代码。
方法匹配Method Matching
现在可以在模式字符串中指定 HTTP 方法使路由器能够区分同一 URL 模式下的不同方法如 GET、POST 等。如果有一个处理 GET 请求的路由在Go 1.22之前可能会这样写路由 http.Handle(/posts/, handlePost) 会匹配所有以 /posts/ 开头的请求而 handlePost 函数需要额外解析 ID 并检查 HTTP 方法。
在 Go 1.22 中可以在路由模式中指定 HTTP 方法。可以这样写 http.Handle(GET /posts/{id}, handlePost2) 这里的 {id} 是一个通配符将匹配路径中的任何部分。handlePost2 函数不再需要检查 HTTP 方法因为路由已经确保了只有 GET 请求会被匹配。可以通过 PathValue 方法从 Request 对象中提取通配符的值 idString : req.PathValue(id) 通配符Wildcards
模式中可以包含通配符用以匹配可变的路径段。通配符 {} 可以匹配路径中的一个部分而 {...} 可以匹配路径中的剩余部分。例如/files/{pathname...} 可以匹配 /files/ 后面的任何路径。
路径前缀匹配
如果想要匹配一个确切的路径包括路径末尾的斜杠可以这样写 http.Handle(/posts/{$}, handlePosts) 这将匹配 /posts/ 但不会匹配 /posts 或 /posts/234。
优先规则
当多个模式匹配同一个请求时确定哪个模式具有优先权是一个比较有挑战性的问题。Go 1.22 采用了基于特定性的规则
如果一个模式匹配的请求集是另一个模式的严格子集则认为它更具体。最具体的模式具有优先权。如果两个模式重叠但没有一个是更具体的则视为冲突注册这两个模式会引发 panic。
例如/posts/latest 比 /posts/{id} 更具体因为它精确匹配一个路径而后者匹配任何以/posts/ 开头的路径。
例如/posts/{id} 和 /{resource}/latest 都可以匹配 /posts/latest这两种模式区分不出哪个更优先所以注册这两个路由会引发 panic。
兼容性
Go 1.22 努力保持与旧版本的兼容性新的模式语法是旧语法的超集所以升级到1.22后代码功能依然是正常的。但是有一些边缘情况需要注意例如旧版本的 Go 会将带有大括号的模式视为字面量而 Go 1.22 将大括号用于通配符可以通过设置 GODEBUG 环境变量的值为 httpmuxgo121 来恢复旧版本的行为。
API 变更
net/http.Request 新增了两个方法
PathValue用于从请求路径中提取通配符的值。SetPathValue允许标准库之外的路由器通过 PathValue 使通配符匹配结果可用。
小结
这些对 net/http 包的增强使得 Go 的标准库在构建具有复杂路由需求的 Web 服务的功能更加强大减少了许多用例对第三方框架的需求。然而对于具有更高级路由需求的应用程序第三方框架仍然是很好的选择。Go 团队通过研究第三方框架、提取常用功能并与社区互动的方式来集成这些特性展现了对满足用户需求和尊重向后兼容原则的承诺。
参考资料
Routing Enhancements for Go 1.22 [https://go.dev/blog/routing-enhancements]