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]
相关文章:
Go 1.22 对 net/http 包的路由增强功能详解
目录 方法匹配(Method Matching) 通配符(Wildcards) 路径前缀匹配 优先规则 兼容性 API 变更 小结 参考资料 Go 1.22 版本对 net/http 包的路由功能进行了增强,引入了方法匹配(method matching&…...
【安卓基础3】Activity(一)
🏆作者简介:|康有为| ,大四在读,目前在小米安卓实习,毕业入职 🏆本文收录于 安卓学习大全,欢迎关注 🏆安卓学习资料推荐: 视频:b站搜动脑学院 视频链接 &…...
SpringBoot基于JWT的token做登录认证
背景 我们在基于Session做登录认证的时候,会有一些问题,因为Session存储到服务器端,然后通过客户端的Cookie进行匹配,如果正确,则通过认证,否则不通过认证。这在简单的系统中可以这么使用,并且…...
[ 2024春节 Flink打卡 ] -- Paimon
2024,游子未归乡。工作需要,flink coding。觉知此事要躬行,未休,特记 Flink 社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合,推出新一代的 Streaming Lakehouse 技术,…...
计算机网络——14CDN
CDN 视频流化服务和CDN:上下文 视频流量:占据着互连网大部分的带宽 Netflix,YouTube:占据37%,16%的下行流量 挑战:规模性-如何服务~1B用户? 单个超级服务器无法提供服务(为什么&am…...
Docker技术仓库
数据卷 为什么用数据卷? 宿主机无法直接访问容器中的文件容器中的文件没有持久化,导致容器删除后,文件数据也随之消失容器之间也无法直接访问互相的文件 为解决这些问题,docker加入了数据卷机制,能很好解决上面问题…...
Kotlin学习 6
1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…...
⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)
LCR 052. 递增顺序搜索树 给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 示例 1: 输入:root [5,…...
获取discord上自己创建的服务器的服务器ID、频道ID以及discord的登录token(用于第三方登录)
在服务器图标上右键点击-》复制服务器ID 在频道上右键点击-》复制频道ID F12->手机模式-》application-》local storage-》填写过滤条件【token】 我开发的chatgpt网站: https://chat.xutongbao.top...
图纸透明加密:保护机械图纸安全的新方法
随着信息技术的不断发展,机械制造行业对于图纸安全的需求越来越高。机械图纸是企业的核心竞争力之一,泄露可能导致严重的商业损失和技术风险。为了解决这一问题,图纸透明加密成为了一种新的保护机械图纸安全的方法。本文将介绍图纸透明加密的…...
基于springboot + vue实现的前后端分离-酒店管理系统
项目介绍 基于springboot vue实现的酒店管理系统一共有酒店管理员和用户这两种角色。 管理员功能 登录:管理员可以通过登录功能进入系统,确保只有授权人员可以访问系统。用户管理:管理员可以添加、编辑和删除酒店的用户,包括前…...
79.SpringBoot的核心注解
一、SpringBoot的核心注解 SpringBootApplication注解:这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解是:SpringBootConfiguration:这个注解实际就是一个Configuration,表示启…...
MATLAB 导出可编辑的eps格式图像
任务描述:部分期刊要求提交可编辑的eps格式图像,方便美工编辑对图像进行美化 我试了直接print或者在figure窗口导出,发现导出的文件放到Adobe AI中并不能编辑,经Google找到解决办法: %EPS exportgraphics(gcf,myVect…...
四问带你搞懂 I3C
大家都知道 I2C ,它的全称是 Inter Integrated Circuit ,那 I3C 又是什么? I3C 是 MIPI (Mobile Industry Processor Interface)移动产业处理器接口联盟推出的,全称是 Improved Inter Integrated Circuit &…...
fastjson解析自定义get方法导致空指针问题
背景 为了在日志中把出入参打印出来,以便验证链路和排查问题,在日志中将入参用fastjson格式化成字符串输出,结果遇到了NPE。 问题复现 示例代码 public static void main(String[] args) {OrganizationId orgId new OrganizationId();N…...
github新手用法详解
GitHub是一个非常强大的版本控制工具,它为程序员提供了一个便捷的方式来管理代码、协作开发和参与开源项目。但对于新手来说,可能会觉得GitHub的使用有些复杂。因此,本篇文章将详细介绍GitHub的基本用法,帮助新手快速上手并充分利…...
MAC电脑系统清理空间免费版软件CleanMyMac X2024
大家好,我是那个总是被苹果电脑“内存已满”提示搞得焦头烂额的专业博主。如果你也像我一样,在使用Mac时经常遭遇卡顿、慢吞吞的情况,那么今天的Mac清理空间妙招分享绝对适合你! CleanMyMac X全新版下载如下: https://wm.makedi…...
notepad++运行python闪一下就没啦
问题:Notepad直接快捷键运行Python代码,出现闪一下就没了 解决措施: ①点击菜单运行(Run) --> 运行(Run)弹出的对话框 ②把 cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT 粘贴进入这个对话框内 ③点击保存&a…...
基于springboot+vue的课程答疑系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
【工具类】非 sudo 运行 docker
非 root 运行 docker 命令 sudo groupadd docker sudo usermod -aG docker $USER newgrp docker sudo chown root:docker /var/run/docker.sock sudo chown "$USER":"$USER" /home/"$USER"/.docker -R sudo chmod grwx "$HOME/.docker&quo…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
