1、用法
在 Gin 路由中,可以使用一個通配符(*)或一個占位符(:)來捕獲 URL 的一部分。
r.GET("/royal/:id", func(c *gin.Context) {id := c.Param("id")//fmt.Println("into :id")c.String(http.StatusOK, "into :id, id is: "+id)})r.GET("royal2/*name", func(c *gin.Context) {name := c.Param("name")//fmt.Println("into *name")c.String(http.StatusOK, "into *name, name is: "+name)})
通配符表示的整個路徑,并且會加上/。
如果通配符什么都不帶,則返回的是一個/。
占位符則是用來獲取一個路徑段的參數:
但如果是占位符后面再跟路由,會報404
占位符注冊的路由以后,可以注冊相同前綴的路由。
比如用占位符注冊了/royal/:id,可以繼續注冊/royal/123,并且訪問/royal/123會精確匹配注冊的路由。
r.GET("/royal/123", func(c *gin.Context) {//id := c.Param("id")//fmt.Println("into :id")c.String(http.StatusOK, "into /royal/123")})
但如果是通配符,則不可以,會報panic。
r.GET("royal2/*name", func(c *gin.Context) {name := c.Param("name")//fmt.Println("into *name")c.String(http.StatusOK, "into *name, name is: "+name)})
2、連續占位符
同一個路由中,允許多個占位符。
r.GET("/royal3/:id/123/:id", func(c *gin.Context) {id := c.Param("id")//fmt.Println("into :id")c.String(http.StatusOK, "/royal3/:id/123/:id"+", id is: "+id)})
查看源碼發現,Param會匹配第一個相同的key,也就是第一個id。
3、連續通配符
r.GET("royal5/*id/123/*name", func(c *gin.Context) {name := c.Param("name")id := c.Param("id")fmt.Println("into *name")c.String(http.StatusOK, "id is: "+id+", name is:"+name)})
連續通配符會panic
4、通配符與占位符的使用
同一路由中,通配符和占位符可以同時使用,但是占位符要在通配符的前面,否則會panic
r.GET("/royal6/*name/:id", func(c *gin.Context) {id := c.Param("id")fmt.Println("into :id")c.String(http.StatusOK, "hello "+id)})
r.GET("royal1/:id/*name", func(c *gin.Context) {name := c.Param("name")id := c.Param("id")fmt.Println("into *name")c.String(http.StatusOK, "id is: "+id+", name is:"+name)})