我就废话不多说了,大家还是直接看代码吧~
package main import ( "fmt" "net/url" ) // Manage the HTTP GET request parameters type GetRequest struct { urls url.Values } // Initializer func (p *GetRequest) Init() *GetRequest { p.urls = url.Values{} return p } // Initialized from another instance func (p *GetRequest) InitFrom(reqParams *GetRequest) *GetRequest { if reqParams != nil { p.urls = reqParams.urls } else { p.urls = url.Values{} } return p } // Add URL escape property and value pair func (p *GetRequest) AddParam(property string, value string) *GetRequest { if property != "" && value != "" { p.urls.Add(property, value) } return p } // Concat the property and value pair func (p *GetRequest) BuildParams() string { return p.urls.Encode() } func main() { init := new(GetRequest).Init() params := init.AddParam("market", "sh").AddParam("Inst","6000987").BuildParams() //params := init.AddParam("market", "sh") fmt.Println(params) }
结果:
Inst=6000987&market=sh
补充: golang常见字符串拼接通用处理方式
前言
我们在日常开发中,尤其是对接第三方登录、支付、分享等功能时,时常需要对自己或接收到的数据进行一定的排序拼接后, 然后进行或加密或校验的处理,虽然写死顺序可以解决问题,但代码缺少了灵活性。
本文从通用性角度,以golang语言来处理一般情况下的字符串拼接问题。
目前已开发成专门的拼接工具go-join,欢迎使用并提出意见。
拼接处理
目前经常遇到的排序方式主要有以下两种:
1、参数名ASCII码从小到大排序
以下是微信开发者平台的签名要求:
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
//JoinStringsInASCII 按照规则,参数名ASCII码从小到大排序后拼接 //data 待拼接的数据 //sep 连接符 //onlyValues 是否只包含参数值,true则不包含参数名,否则参数名和参数值均有 //includeEmpty 是否包含空值,true则包含空值,否则不包含,注意此参数不影响参数名的存在 //exceptKeys 被排除的参数名,不参与排序及拼接 func JoinStringsInASCII(data map[string]string, sep string, onlyValues, includeEmpty bool, exceptKeys ...string) string { var list []string var keyList []string m := make(map[string]int) if len(exceptKeys) > 0 { for _, except := range exceptKeys { m[except] = 1 } } for k := range data { if _, ok := m[k]; ok { continue } value := data[k] if !includeEmpty && value == "" { continue } if onlyValues { keyList = append(keyList, k) } else { list = append(list, fmt.Sprintf("%s=%s", k, value)) } } if onlyValues { sort.Strings(keyList) for _,v := range keyList { list = append(list,data[v]) } }else { sort.Strings(list) } return strings.Join(list, sep) }
示例:
data := make(map[string]string) data["appid"] = "wx_1234535" data["body"] = "test data" data["mch_id"] = "572836589" data["notify_url"] = "http://www.baidu.com" data["trade_type"] = "MWEB" data["spbill_create_ip"] = "192.169.0.1" data["total_fee"] = "100" data["out_trade_no"] = "2745890486870" data["nonce_str"] = "kdjskgjokghdk" data["sign"] = "signData" log.Println("str :", JoinStringsInASCII(data, "&", false, false, "sign")) log.Println("str2 :", JoinStringsInASCII(data, "&", true, false, "sign"))
示例结果:
str : appid=wx_1234535&body=test data&mch_id=572836589&nonce_str=kdjskgjokghdk¬ify_url=http://www.baidu.com&out_trade_no=2745890486870&spbill_create_ip=192.169.0.1&total_fee=100&trade_type=MWEB str2 : wx_1234535&test data&572836589&kdjskgjokghdk&http://www.baidu.com&2745890486870&192.169.0.1&100&MWEB
2.按照特定的参数顺序拼接
//JoinStringsInOrder 数名按固定顺序排列后拼接 //data 待拼接的数据 //sep 连接符 //onlyValues 是否只包含参数值,true则不包含参数名,否则参数名和参数值均有 //orders 按照顺序的参数名,没有的不参与拼接 func JoinStringsInOrder(data map[string]string, sep string,onlyValues bool, orders ...string) string { var list []string for _, key := range orders { if _,ok := data[key];!ok { continue } if onlyValues { list = append(list, data[key]) }else { list = append(list, fmt.Sprintf("%s=%s", key, data[key])) } } return strings.Join(list, sep) }
示例:
log.Println("str3 :", JoinStringsInOrder(data, "&", false, "appid","body","mch_id","notify_url"))
log.Println("str4 :", JoinStringsInOrder(data, "&", true, "appid","body","mch_id","notify_url"))
示例结果:
str3 : appid=wx_1234535&body=test data&mch_id=572836589¬ify_url=http://www.baidu.com
str4 : wx_1234535&test data&572836589&http://www.baidu.com
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 群星《赤热 电视剧音乐原声》[320K/MP3][427.21MB]
- 周华健.1996-爱的光【滚石】【WAV+CUE】
- 杨宗宪.1996-想啥人怨啥人等啥人【有容唱片】【WAV+CUE】
- 郑秀文.2024-Best.Concert.Live【华纳】【FLAC分轨】
- 《Pax Dei》配置要求一览
- 《过山车之心2》存档位置介绍
- 《三国志8 REMAKE》评测:自定义的三国演义
- 群星《少年白马醉春风 网剧OST原声专辑》[320K/MP3][117.05MB]
- 群星《少年白马醉春风 网剧OST原声专辑》[FLAC/分轨][621.04MB]
- 《魏佳艺5CD合集》[WAV分轨][3.8G]
- CSGO职业选手donk怎么样 2024最新donk个人资料介绍
- CSGO职业选手NiKo怎么样 2024最新Niko个人资料介绍
- 剑网3丝路风语PVE焚影怎么打 丝路风语PVE焚影圣诀手法配装攻略
- [老虎魚古典名盘]心碎SACD浪漫小提琴之声[DSF]
- Queen(皇后乐队)《GreatestHitsII》[SACD-DSF]