Go http 服务默认的路由规则和更好的路由

本文最后更新于:2021年10月20日 下午

Go http 服务默认的路由规则和更好的路由

Go Default Router

1
2
3
4
5
6
7
8
9
10
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request){
handler := sh.srv.Handler
if handler == nil {
handler = DefaultServeMux // 使用缺省的Router
}
if req.RequestURI == “*” && req.Method == “OPTIONS” {
handler = globlOptionsHandler{}
}
handler.ServeHTTP(rw,req)
}

路由规则

  • URL 分为两种,末尾是 /: 表示一个子树,后面可以跟其他的子路径;末尾不是 / ,表示一个叶子,固定的路径
    以 /结尾的 URL 可以匹配它的任何子路径,比如 /images 回匹配 /images/cute-cat.jpg*
  • 它采用最长匹配原则,如果多个匹配,一定采用匹配路径最长的那个进行处理
  • 如果没有找到任何匹配项,会返回 404

更好的 Router

https://github.com/julienschmidt/httprouter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
"log"
)

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
fmt.Fprint(w, "Welcome!\n")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

func main() {
router := httprouter.New()
router.GET("/", Index)
router.GET("/hello/:name", Hello)

log.Fatal(http.ListenAndServe(":8080", router))
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!