zl程序教程

您现在的位置是:首页 >  其他

当前栏目

「Go工具箱」推荐一个Google开发的将结构体快速拼接成url查询参数的工具

GoogleGo工具开发 快速 查询 一个 参数
2023-06-13 09:16:47 时间

大家好,我是渔夫子。本号新推出「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文档。