背景

今天遇到一个需求

我: gin怎么匹配这种路由: 域名/xxx-notify 和 域名/yyy-notify, 可以提取里面的xxx,yyy

群友A: 把xxx,yyy作为参数

我: url已经约定了,不能改

群友B: 可以获取到xxx-notify,然后自己按-分割出xxx

package main

import (
    "net/http"
    "strings"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/user/:name/*action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        //截取/
        action = strings.Trim(action, "/")
        c.String(http.StatusOK, name+" is "+action)
    })
    //默认为监听8080端口
    r.Run(":8000")
}

我: 试了,确实可以,牛皮

package main

import (
	"fmt"
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/adds/*-notify", func(c *gin.Context) {
		action := c.Param("-notify")
		action = strings.Trim(action, "/")
		ss := strings.Split(action, "-")
		fmt.Println("渠道信息",ss[0])
		c.String(http.StatusOK, "%+v", ss)
	})
	//默认为监听8080端口
	r.Run(":8000")
}

我: c.Param这里是咋匹配出-notify的结果的呢[捂脸]

群友B: 啥意思

我: 没太明白gin的前缀树是咋匹配到/weibo-notify这部分的。

TODO 具体解析

前缀树代码有的难,一时不好看,尤其是通配符:*的处理

参考

1.gin的路由就是基于这个写的 2.路由图解-TODO-通配符和树结构图示

原创文章转载请注明出处: gin-router代码阅读