前言
大家在寫golang http服務(wù)的時(shí)候或許會(huì)碰到 Request
中 url.Values
轉(zhuǎn)換成 struct
的需要剩辟。
思路
翻開 net.url
查看 url.Values
的定義
type Values map[string][]string
那么我是不是可以通過遍歷 struct
的 Field
獲取對(duì)應(yīng)的數(shù)據(jù)類型,以及通過tag來從 url.Values
中獲取對(duì)應(yīng)的參數(shù)?
答案是可以的贩猎,那么我們就開動(dòng)吧熊户。
先來定義一個(gè) struct
,還有一個(gè)叫 param
的tag。
type User struct {
UserId int `param:"user_id,100"
}
struct說明
字段名: UserId
url.Values中的字段名: user_id
默認(rèn)值: 100
實(shí)現(xiàn)
typ := val.Type()
for i := 0; i < val.NumField(); i++ {
kt := typ.Field(i) //獲取字段類型
tag := kt.Tag.Get("param") //獲取tag
sv := val.Field(i) //獲取字段值
uv := getVal(values, tag) //獲取默認(rèn)值
switch sv.Kind() {
case reflect.String:
....
case reflect.Bool:
....
}
}
性能測(cè)試
goos: linux
goarch: amd64
pkg: github.com/youkale/go-querystruct/params
2000000000 0.00 ns/op
PASS
最后
好了吭服,思路基本上是這樣的,具體實(shí)現(xiàn)細(xì)節(jié)請(qǐng)參考