为 matcher 包所有文件添加完整文档注释: - conflict: 路径冲突检测器 - exact: 精确路径匹配器(O(1) hash map) - location: 统一匹配引擎(整合所有策略) - matcher: 匹配结果和接口定义 - named: 命名捕获组匹配器 - prefix: 普通前缀匹配器 - prefix_priority: 前缀优先匹配器(^~) - radix: Radix Tree 最长前缀匹配 - regex: 正则表达式匹配器 注释说明匹配优先级顺序(精确 > 前缀优先 > 正则 > 普通前缀), 以及各匹配器的使用方法和性能特点。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
// Package matcher 提供 nginx 风格的 location 匹配引擎实现。
|
||
//
|
||
// 该文件实现前缀匹配器,基于 Radix Tree 实现最长前缀匹配。
|
||
//
|
||
// 作者:xfy
|
||
package matcher
|
||
|
||
import "github.com/valyala/fasthttp"
|
||
|
||
// PrefixMatcher 普通前缀匹配器(封装 RadixTree)。
|
||
//
|
||
// 使用 Radix Tree 数据结构存储前缀路径,
|
||
// 查找时返回最长匹配前缀,对应 nginx 无修饰符前缀匹配。
|
||
type PrefixMatcher struct {
|
||
// tree 基数树,存储前缀路径
|
||
tree *RadixTree
|
||
|
||
// priority 匹配优先级,普通前缀为 4(最低)
|
||
priority int
|
||
}
|
||
|
||
// NewPrefixMatcher 创建前缀匹配器。
|
||
//
|
||
// 返回值:
|
||
// - *PrefixMatcher: 前缀匹配器实例,内部已初始化 Radix Tree
|
||
func NewPrefixMatcher() *PrefixMatcher {
|
||
return &PrefixMatcher{
|
||
tree: NewRadixTree(),
|
||
priority: 4, // 普通前缀优先级
|
||
}
|
||
}
|
||
|
||
// AddPath 添加路径到前缀匹配器。
|
||
//
|
||
// 参数:
|
||
// - path: 前缀路径
|
||
// - handler: 匹配成功后的请求处理器
|
||
//
|
||
// 返回值:
|
||
// - error: 路径重复或树已初始化时返回错误
|
||
func (pm *PrefixMatcher) AddPath(path string, handler fasthttp.RequestHandler) error {
|
||
return pm.tree.Insert(path, handler, pm.priority, "prefix")
|
||
}
|
||
|
||
// Match 前缀匹配,返回最长前缀匹配结果。
|
||
//
|
||
// 参数:
|
||
// - path: 待匹配的请求路径
|
||
//
|
||
// 返回值:
|
||
// - *MatchResult: 最长前缀匹配结果,无匹配时返回 nil
|
||
func (pm *PrefixMatcher) Match(path string) *MatchResult {
|
||
return pm.tree.FindLongestPrefix(path)
|
||
}
|
||
|
||
// MarkInitialized 标记初始化完成。
|
||
//
|
||
// 调用后不能再添加新路径,确保运行时线程安全。
|
||
func (pm *PrefixMatcher) MarkInitialized() {
|
||
pm.tree.MarkInitialized()
|
||
}
|