Go 1.22 对 net/http 包的路由增强功能详解

这篇具有很好参考价值的文章主要介绍了Go 1.22 对 net/http 包的路由增强功能详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

方法匹配(Method 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]文章来源地址https://www.toymoban.com/news/detail-837119.html

到了这里,关于Go 1.22 对 net/http 包的路由增强功能详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Go 基础篇】Go语言 init函数详解:包的初始化与应用

    在Go语言中, init() 函数是一种特殊的函数,用于在包被导入时执行一次性的初始化操作。 init() 函数不需要手动调用,而是在包被导入时自动执行。这使得我们可以在包导入时完成一些必要的初始化工作,确保包的使用具有正确的环境和状态。 本篇博客将深入探讨 init() 函数

    2024年02月11日
    浏览(35)
  • 力扣日记1.22-【回溯算法篇】216. 组合总和 III

    日期:2023.1.22 参考:代码随想录、力扣 题目描述 难度:中等 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入:

    2024年01月23日
    浏览(32)
  • 问题解决:ImportError:Numba needs NumPy 1.22 or less

    跑一个以前的代码,总是报错:ImportError:Numba needs NumPy 1.22 or less 查了下,网上都说是numpy的版本不能匹配上Numba,需要安装低版本的numpy,用pip list查看确实是版本没能够达到要求,即1.22版本以下: 网上给的意见大多数是,重新安装低版本的numpy,于是进行了尝试,但是一直

    2024年02月16日
    浏览(41)
  • virtualBox 在ubuntu 22.04 中自动安装安装增强功能不生效的解决方法

    virtualBox界面依次点击:控制----设置—高级—双向—确定 一般 点击: 设备— 安装增强功能 -- 重启虚拟机 即可 但是遇到了安装后也没生效的问题,可以通过 进入到光盘路径 以root用户 运行 VBoxLinuxAdditions.run 然后再重启来解决 如果遇到选项卡中无设备菜单,需要点击:控制—

    2024年04月12日
    浏览(27)
  • Go net http包

    在Go中,搭建一个HTTP server简单到令人难以置信。只需要引入net/http包,写几行代码,一个HTTP服务器就可以正常运行并接受访问请求。 下面就是Go最简单的HTTP服务器: 编译运行程序,然后打开浏览器访问 http://localhost:8080/ , 我们可以看到网页输出\\\"hi\\\" ! 就这么简单,我们实现了

    2024年02月08日
    浏览(34)
  • Go语言网络库net/http

    Http 协议(Hyper Text Transfer Protocol,超文本传输协议)是一个简单的请求-响应协议,它通常运行在 TCP 之 上。超文本传输协议是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。 Http 协议是基于客户端 Cilent /服务器 Server 模式,且面向连接的。简单

    2024年02月15日
    浏览(23)
  • GO学习之 网络通信(Net/Http)

    1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Http) 11、GO学习之 微框架(Gin) 12、GO学习

    2024年02月13日
    浏览(37)
  • Curl- go的自带包 net/http实现

    case http 包中的 Request 发送请求的步骤:1. 创建客户端 2. 发送请求 3. 接受响应 http.NewRequest method get,post,delete,put url body :可以是多种形式的数据包含在请求体中 我们可以看出这个 : body 是一个 io.Reader 所以 Request 的请求体就是字节流。所以制定编码方式-》用 header 指定

    2024年01月20日
    浏览(26)
  • Go语言 -- Web开发基础学习 net/http包

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go语言最擅长的领域就是Web开发,此贴是本人入门完go语法基础后学习Web开发的学习笔记。 新建go文件hello_world.go 写入: 在命令行运行: go run ./hello_world.go 可以发现控制台输出以下信息 通过上述代码

    2024年02月06日
    浏览(40)
  • Go http.Handle和http.HandleFunc的路由问题

    Golang的net/http包提供了原生的http服务,其中http.Handle和http.HandleFunc是两个重要的路由函数。 两个函数中的pattern参数为路由匹配,不需要输入域名。 \\\"/\\\"在其他路由没有匹配成功的时候,匹配任何路由。浏览器请求的URL为localhost:8080 \\\"/js/\\\"浏览器请求的路由为localhost:8080/js/ http.H

    2024年02月07日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包