add TempSkippedNodesPool

This commit is contained in:
WJQSERVER 2025-12-14 23:16:29 +08:00
parent 9cfc82a347
commit 60b2936eff
2 changed files with 23 additions and 3 deletions

View file

@ -89,7 +89,7 @@ func (c *Context) reset(w http.ResponseWriter, req *http.Request) {
if cap(c.Params) > 0 { if cap(c.Params) > 0 {
c.Params = c.Params[:0] c.Params = c.Params[:0]
} else { } else {
c.Params = make(Params, 0, 5) c.Params = make(Params, 0, c.engine.maxParams)
} }
c.handlers = nil c.handlers = nil
c.index = -1 // 初始为 -1`Next()` 将其设置为 0 c.index = -1 // 初始为 -1`Next()` 将其设置为 0

View file

@ -421,6 +421,22 @@ func getHandlerName(h HandlerFunc) string {
} }
// TempSkippedNodes池
var TempSkippedNodesPool = sync.Pool{
New: func() any {
return make([]skippedNode, 0, 256)
},
}
func GetTempSkippedNodes() *[]skippedNode {
return TempSkippedNodesPool.Get().(*[]skippedNode)
}
func PutTempSkippedNodes(skippedNodes *[]skippedNode) {
*skippedNodes = (*skippedNodes)[:0] // 重置slice
TempSkippedNodesPool.Put(skippedNodes)
}
// 405中间件 // 405中间件
func MethodNotAllowed() HandlerFunc { func MethodNotAllowed() HandlerFunc {
return func(c *Context) { return func(c *Context) {
@ -433,7 +449,9 @@ func MethodNotAllowed() HandlerFunc {
allowedMethods := []string{} allowedMethods := []string{}
for _, treeIter := range engine.methodTrees { for _, treeIter := range engine.methodTrees {
// 注意这里 treeIter.root 才是正确的,因为 treeIter 是 methodTree 类型 // 注意这里 treeIter.root 才是正确的,因为 treeIter 是 methodTree 类型
value := treeIter.root.getValue(requestPath, nil, &c.SkippedNodes, false) tempSkippedNodes := GetTempSkippedNodes()
value := treeIter.root.getValue(requestPath, nil, tempSkippedNodes, false)
PutTempSkippedNodes(tempSkippedNodes)
if value.handlers != nil { if value.handlers != nil {
allowedMethods = append(allowedMethods, treeIter.method) allowedMethods = append(allowedMethods, treeIter.method)
} }
@ -451,7 +469,9 @@ func MethodNotAllowed() HandlerFunc {
continue continue
} }
// 注意这里 treeIter.root 才是正确的,因为 treeIter 是 methodTree 类型 // 注意这里 treeIter.root 才是正确的,因为 treeIter 是 methodTree 类型
value := treeIter.root.getValue(requestPath, nil, &c.SkippedNodes, false) // 只查找是否存在,不需要参数 tempSkippedNodes := GetTempSkippedNodes()
value := treeIter.root.getValue(requestPath, nil, tempSkippedNodes, false) // 只查找是否存在,不需要参数
PutTempSkippedNodes(tempSkippedNodes)
if value.handlers != nil { if value.handlers != nil {
// 使用定义的ErrorHandle处理 // 使用定义的ErrorHandle处理
engine.errorHandle.handler(c, http.StatusMethodNotAllowed, errors.New("method not allowed")) engine.errorHandle.handler(c, http.StatusMethodNotAllowed, errors.New("method not allowed"))