莫一哲

现在很少听李志的歌了,有人说,是现在的生活没那么苦了,可是,也许我们早已经习惯生活的苦了,致敬,逼哥的歌 2018-03-08 13:49 by fifsky

go对URL参数的处理类似PHP(http_build_query)

开始用GO写一些小代码,还是无法摆脱PHP的固定思维,在请求接口的时候php很容易就想到了http_build_query,到了GO里面就不知道改怎么处理了,特别是GO的强类型,处理起来异常痛苦,今天看到文章发现我自己实现的方式太山寨了,贴一下标准做法和山寨做法,如果你有什么更好的方式,欢迎交流


 func HttpBuildQuery(params map[string]string) (param_str string) {

	params_arr := make([]string, 0, len(params))

	for k, v := range params {
		params_arr = append(params_arr, fmt.Sprintf("%s=%s", k, v))
	}

	//fmt.Println(params_arr)

	param_str = strings.Join(params_arr, "&")
	return param_str
}


func main(){
	params := map[string]string{
		"action":        "getAccessToken",
		"client_code":   "aaaaa",
		"client_secret":  "ccccc",
		"interface":     "wxapi",
		"time":          strconv.FormatInt(time.Now().Unix(), 10),
	}
       
	param_str := HttpBuildQuery(params)

}
标准做法如下
 params := map[string]string{
		"action":        "getAccessToken",
		"client_code":   "aaaa",
		"client_secret": "cccc",
		"interface":     "wxapi",
		"time":          strconv.FormatInt(time.Now().Unix(), 10),
	}

	u, _ := url.Parse("")

	q := u.Query()

	q.Set("action", "getAccessToken")
	q.Set("client_code", clientCode)
	q.Set("client_secret", clientSecret)
	q.Set("interface", "wxapi")
	q.Set("refresh", refresh)
	q.Set("time", strconv.FormatInt(time.Now().Unix(), 10))

	u.RawQuery = q.Encode() 
        fmt.Printf(u.String())  

----------------------------------分割线---------------------------------

发现GO的net/url包很强大,基本可以实现PHP对URL处理的所有功能,最新的处理方法如下

 //url.Values{} //实例化Values结构 我们看到了Values 是一个map[string][]string结构,所以其实实例化可以这样
	c := url.Values{"method": {"show", "aaaa"}, "id": {"1"}}
	fmt.Println(c.Encode())


  • 1
返回顶部