Golang中urlencode與urldecode編碼解碼詳解
一、urlencode
golang下可以使用net/url模塊實(shí)現(xiàn)urlencode和urldecode操作。具體實(shí)現(xiàn)的函數(shù)為url.QueryEscape和url.QueryUnescape,代碼如下:
package main
import( "fmt"
"net/url")
func main() { var urlStr string = "運(yùn)維之路"
escapeUrl := url.QueryEscape(urlStr)
fmt.Println("編碼:",escapeUrl)
enEscapeUrl, _ := url.QueryUnescape(escapeUrl)
fmt.Println("解碼:",enEscapeUrl)
}如果涉及到多個參數(shù)轉(zhuǎn)碼的,這在get和post請求中都有,比如id=100&site=361way.com這樣的??梢栽谕ㄟ^url.Values進(jìn)行增加后轉(zhuǎn)碼,發(fā)下:
package main
import (
"fmt"
"net/url"
)
func main() {
params := url.Values{}
params.Add("name", "@Rajeev")
params.Add("phone", "+919999999999")
fmt.Println(params.Encode())
}
#輸出:
name=%40Rajeev&phone=%2B919999999999同樣的,我們通過url的其他函數(shù)處理操作過后,一個典型的get請求的URL如下:
package main
import (
"fmt"
"net/url"
)
func main() {
// Let's start with a base url
baseUrl, err := url.Parse("http://www.mywebsite.com")
if err != nil {
fmt.Println("Malformed URL: ", err.Error())
return
}
// Add a Path Segment (Path segment is automatically escaped)
baseUrl.Path += "path with?reserved characters"
// Prepare Query Parameters
params := url.Values{}
params.Add("q", "Hello World")
params.Add("u", "@rajeev")
// Add Query Parameters to the URL
baseUrl.RawQuery = params.Encode() // Escape Query Parameters
fmt.Printf("Encoded URL is %q
", baseUrl.String())
}
#輸出結(jié)果
Encoded URL is "http://www.mywebsite.com/path%20with%3Freserved%20characters?q=Hello+World&u=%40rajeev"二、urldecode
簡單的url解碼,直接使用Unescape就可以了,如下:
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
encodedValue := "Hell%C3%B6+W%C3%B6rld%40Golang"
decodedValue, err := url.QueryUnescape(encodedValue)
if err != nil {
log.Fatal(err)
return
}
fmt.Println(decodedValue)
}帶form 參數(shù),就像上面提到的"param1=value1¶m2=value2"這種格式的可以使用url.ParseQuery()參數(shù)解析成map[string][]string格式,如下:
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
queryStr := "name=Rajeev%20Singh&phone=%2B9199999999&phone=%2B628888888888"
params, err := url.ParseQuery(queryStr)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("Query Params: ")
for key, value := range params {
fmt.Printf(" %v = %v
", key, value)
}
}
#其輸出為:
Query Params:
name = [Rajeev Singh]
phone = [+9199999999 +628888888888]一個get請求類,后面帶參數(shù)的URL,可以通過如下方式解析并解碼
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
u, err := url.Parse("https://www.website.com/person?name=Rajeev%20Singh&phone=%2B919999999999&phone=%2B628888888888")
if err != nil {
log.Fatal(err)
return
}
fmt.Println("Scheme: ", u.Scheme)
fmt.Println("Host: ", u.Host)
queries := u.Query()
fmt.Println("Query Strings: ")
for key, value := range queries {
fmt.Printf(" %v = %v
", key, value)
}
fmt.Println("Path: ", u.Path)
}
# 輸出如下:
Scheme: https
Host: www.website.com
Query Strings:
phone = [+919999999999 +628888888888]
name = [Rajeev Singh]
Path: /person總結(jié)
到此這篇關(guān)于Golang中urlencode與urldecode編碼解碼的文章就介紹到這了,更多相關(guān)Golang中urlencode與urldecode內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言實(shí)現(xiàn)AOI區(qū)域視野管理流程詳解
在游戲中,場景里存在大量的物體.如果我們把所有物體的變化都廣播給玩家.那客戶端很難承受這么大的壓力.因此我們肯定會做優(yōu)化.把不必要的信息過濾掉.如只關(guān)心玩家視野所看到的.減輕客戶端的壓力,給玩家更流暢的體驗2023-03-03
Go語言中基本數(shù)據(jù)類型的相互轉(zhuǎn)換詳解
Go在不同類型的變量之間賦值時需要顯示轉(zhuǎn)換,不能自動轉(zhuǎn)換。這篇文章主要和大家介紹了Go語言中基本數(shù)據(jù)類型的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下2022-10-10
Go從defer關(guān)鍵字到鎖用法實(shí)例demo
在Go語言中,defer語句用于延遲執(zhí)行一個函數(shù)或方法,直到包含它的函數(shù)執(zhí)行完畢時才執(zhí)行,這篇文章主要介紹了Go從defer關(guān)鍵字到鎖用法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-06-06
Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法
這篇文章主要介紹了Golang編程實(shí)現(xiàn)刪除字符串中出現(xiàn)次數(shù)最少字符的方法,涉及Go語言字符串遍歷與運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
詳解Go語言中自定義結(jié)構(gòu)體能作為map的key嗎
在Go中,引用類型具有動態(tài)的特性,可能會被修改或指向新的數(shù)據(jù),這就引發(fā)了一個問題—能否將包含引用類型的自定義結(jié)構(gòu)體作為map的鍵呢,本文就來和大家想想講講2023-06-06

