From b4e2ca45851c5a656de7cb77b803a10d7e953f91 Mon Sep 17 00:00:00 2001 From: guonaihong Date: Fri, 14 Jun 2019 19:35:26 +0800 Subject: [PATCH] achieve #1866 ```go package main import ( "fmt" "github.com/gin-gonic/gin" "time" ) func main() { r := gin.Default() r.GET("/:int/:string/:float/:bool/:duration", func(c *gin.Context) { var i int var err error err = c.ParamVar("int", &i) fmt.Printf("%v, %v\n", i, err) var b bool err = c.ParamVar("bool", &b) fmt.Printf("%v, %v\n", b, err) var f float64 err = c.ParamVar("float", &f) fmt.Printf("%v, %v\n", f, err) var s string err = c.ParamVar("string", &s) fmt.Printf("%v, %v\n", s, err) var d time.Duration err = c.ParamVar("duration", &d) fmt.Printf("%v, %v\n", d, err) }) r.Run() return } // client // curl -X GET 127.0.0.1:8080/1/test/3.14/true/1s ``` --- context.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/context.go b/context.go index e3ddfef1..f65f9402 100644 --- a/context.go +++ b/context.go @@ -328,6 +328,31 @@ func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string) return } +// ParamVar get the value of the URL param. +// curl -X GET 127.0.0.1:8080/1/test/3.14/true/1s +// +// router.GET("/:int/:string/:float/:bool/:duration", func(c *gin.Context) { +// var i int +// var b bool +// var f float64 +// var s string +// var d time.Duration + +// err = c.ParamVar("int", &i) // int == 1 +// err = c.ParamVar("bool", &b) // bool == true +// err = c.ParamVar("float", &f) // float == 3.14 +// err = c.ParamVar("string", &s) // string == test +// err = c.ParamVar("duration", &d) // duration == time.Second +// }) +func (c *Context) ParamVar(key string, val interface{}) error { + rv := reflect.ValueOf(val) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + return errors.New("Invalid parameter") + } + + return binding.SetValue(rv, rv.Elem(), []string{c.Param(key)}, true) +} + /************************************/ /************ INPUT DATA ************/ /************************************/