lolly/internal/matcher/prefix.go
xfy 6094327620 docs(matcher): 为 location 匹配引擎添加标准化 godoc 注释
为 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>
2026-04-20 10:59:27 +08:00

62 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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()
}