Radix树是将路径结构转化为内存指针跳转图,匹配耗时仅取决于路径长度而非路由总数;httprouter中/:id写成/id即404,因注册时/user/id被存为静态字面量,请求/user/123按段拆解后无法匹配;参数名须以/:开头、仅含字母数字下划线、大小写敏感;GET与POST同路径需分别注册,各自独立成树,未注册方法返回405;不支持*或正则,仅允许末尾的/filepath通配;超出其设计边界时应换chi或加适配器而非硬改。

Radix树不是“更快的字符串匹配”,而是把路径结构变成内存中的指针跳转图——注册10万路由,/api/v2/users/123匹配耗时仍只取决于路径长度,和路由总数无关。
httprouter里/:id写成/id就404,根本原因在注册阶段
httprouter在调用router.GET("/user/id", h)时,就把/user/id当作纯静态字面量存进树里;而请求/user/123会按段拆成["", "user", "id"]去查,自然找不到123这个子节点。
-
/:id必须带前导/,冒号紧贴斜杠,不能是:id或/id - 参数名只允许字母、数字、下划线;
:user-id会被整段当静态路径,不触发参数提取 -
/:a/:b合法,/:a:b不合法——后者被解析为静态字符串a:b - 大小写敏感:
/:ID注册后,ps.ByName("id")返回空字符串,不会自动转换
GET和POST同路径必须分开注册,没有fallback机制
httprouter内部为每个HTTP方法维护独立的Radix树。注册router.GET("/api/user", h),只是往GET树里插一个叶子节点;POST /api/user请求进来时,它连GET树都不进,直接查POST树——没注册就返回405 Method Not Allowed,不是404。
- 不存在
router.Any()或router.Methods("GET,POST")这种接口 - 复用逻辑必须抽离成普通函数,不要试图在路由层“合并方法”
-
router.Handler("GET", "/path", h)是桥接标准http.Handler的入口,不是补漏手段
/*filepath是唯一支持的通配形式,且只能出现在末尾
Radix树本质只做前缀匹配和参数占位,不支持回溯或模式展开。/api/v1/**或/file/{name:[a-z]+}这类写法,httprouter原生不识别,要么报错,要么整段降级为静态路径。
立即学习“go语言免费学习笔记(深入)”;
-
/*filepath必须是路径最后一段,且全局只能有一个;/a/*x/b注册会失败 -
/*filepath匹配后,ps.ByName("filepath")返回的是剩余完整路径(含开头斜杠),比如/api/v1/users/123匹配/api/v1/*filepath,值为/users/123 - 需要版本通配?别幻想
/v1/**,应显式分治注册/v1/users、/v1/posts等 - 真要兜底,设
router.NotFound = your404Handler,而不是注册/*filepath假装能覆盖一切
真正难的不是理解Radix树怎么跳指针,而是意识到:一旦你开始改router.GET行为、加正则校验、绕过method分树限制,说明你已经超出了httprouter的设计边界——这时候换chi或加一层适配器,比硬patch更省时间。



















