大家好,我是渔夫子。本号新推出「go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。
今天给大家推荐的是一个将结构体快速的构造成url查询参数的工具:go-querystring。
该包通过在结构体中自定义url的tag标签,然后基于reflect反射来解析各个字段的类型和值,最终通过内置包中的url.Values实现的。
在程序中使用import引入该包即可使用:
import "github.com/google/go-querystring/query"包的使用
定义一个结构体,然后通过该包的Encode函数便能将其构造成url中的查询字符串:
type Options struct {Query string `url:"q"`ShowAll bool `url:"all"`Page int `url:"page"`}opt := Options{ "foo", true, 2 }v, _ := query.Values(opt)// will output: "q=foo&all=true&page=2"fmt.Print(v.Encode())
该包还支持结构体的嵌套、匿名结构体、切片、数组、指针、Time等类型的转换。
下面是一个使用切片的例子,通过在tag中增加comma标签,代表以逗号将值进行连接(实际输出时会有url的转义):
type Options struct {Score []int `url:"score,comma"`}opt := Options{Score: []int{1,2,3}}v, _ := query.Values(opt)// will output: "score=1,2,3"fmt.Print(v.Encode())
最后,我们再看一个使用时间类型的例子:
type Options struct {CreatedAt time.Time `url:"created_at";layout:"2006-01-02"`}opt := Options{CreatedAt: time.Now()}//will output: "created_at=2022-09-03T21:48:44+08:00
优缺点分析
该包的优点就是简单、快速。只要定义一个结构体,调用该包的Encode函数就能将结构体中的字段自动拼接成url的查询参数。当然其缺点就是性能差。下面是一个使用该包和不使用该包的基准测试结果,基本上该包的性能是go内置包的5倍还多。如下图:
更多项目详情请查看如下链接。
开源项目地址:https://github.com/google/go-querystring
开源项目作者:Google
---特别推荐---
特别推荐:一个专注go项目实战、项目中踩坑经验及避坑指南、各种好玩的go工具的公众号,「Go学堂」,专注实用性,非常值得大家关注。点击下方公众号卡片,直接关注。关注送《100个go常见的错误》pdf文档。