服务计算作业七——mux包源码分析,从与DefaultServeMux对比入手

本文分析了Go语言中默认的`DefaultServeMux`路由处理与第三方库`gorilla/mux`的差异。`DefaultServeMux`在功能上较为基础,不支持参数和RESTful模式。而`gorilla/mux`提供了更丰富的功能,如参数匹配、正则支持、方法限制等。通过源码解析,展示了`gorilla/mux`如何进行路由匹配及注册,特别提到了`PathPrefix`在处理静态文件访问中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

golang自带路由库 http.ServerMux实现了一些简单的路由功能,但是还十分不足,因此可以借助gorilla/mux中的功能弥补,那么他们两种实现有什么区别呢?

DefaultServeMux

在DefaultServeMux中,可以找到关于路由表的实现部分:

type ServeMux struct {
    mu sync.RWMutex
    m map[string]muxEntry
}
  
type muxEntry struct {
    explicit bool
    h Handler
    pattern string
}

其中muxEntry储存了路由表的基本信息,如是否冲突,处理函数等。

路由注册的过程就是向路由表中插入相应值的过程,返回最长匹配路径的路由的相关信息,如果找不到则返回NotFoundHandler。

  func (mux *ServeMux) handler(host, path string) (h Handler, pattern string) {
          mux.mu.RLock()
          defer mux.mu.RUnlock()
          if h == nil {
                  h, pattern = mux.match(path)
          }
          if h == nil {
                  h, pattern = NotFoundHandler(), ""
          }
          return
  }

  func (mux *ServeMux) match(path string) (h Handler, pattern string) {
          var n = 0
          for k, v := range mux.m {
                  if !pathMatch(k, path) {
                  continue
                  }

                  if h == nil || len(k) > n {
                  n = len(k)
                  h = v.h
                  pattern = v.pattern
                  }
          }
          return
  }

  func pathMatch(pattern, path string) bool {
  n := len(pattern)
          if pattern[n-1] != '/' {
                  return pattern == path
          }
          return len(path) >= n && path[0:n] == pattern
  }

但是DefaultServeMux也存在很大缺陷,如不支持参数设定,例如/user/:uid 这种泛型类型匹配,也不支持正则;无法很友好的支持REST模式,无法限制访问方法(POST,GET等)。

gorilla/mux

在本次项目中,第一次调用mux是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值