最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang net.url標準庫的具體使用

 更新時間:2025年06月09日 10:54:23   作者:nbplus_007  
本文主要介紹了golang net.url標準庫的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Go 語言標準庫中的 net/url 包提供了用于 URL 解析、構建和查詢的功能。這個包使我們能夠處理 URL,從中提取出各個部分,比如協(xié)議、主機、路徑和查詢參數等。以下是 net/url 包中一些常用的功能:

  • 解析URL:使用 Parse 函數可以將 URL 字符串解析為 url.URL 結構體。
u, err := url.Parse("https://example.com/path?key1=value1&key2=value2")
if err != nil {
    log.Fatal(err)
}
  • 構建URL:可以使用 url.URL 結構體中的方法來構建 URL。
u := &url.URL{
    Scheme:   "https",
    Host:     "example.com",
    Path:     "/path",
    RawQuery: "key1=value1&key2=value2",
}
  • 查詢參數:url.Values 類型表示 URL 查詢參數,可以用于構建和解析查詢參數。
u, _ := url.Parse("https://example.com/path?key1=value1&key2=value2")
queryValues := u.Query()
fmt.Println(queryValues.Get("key1"))  // 輸出: value1
fmt.Println(queryValues.Get("key2"))  // 輸出: value2

其它功能:url.URL 結構體中還提供了一些其他方法,比如獲取完整的 URL 字符串、處理路徑、解析主機等等。

基本類型結構

<schema>://<user>:<password>@<host>:<port>/<path>:<params>?<query>#<frag>

參數描述:

名稱描述
scheme方案是如何訪問指定資源的主要標識符,他會告訴負責解析URL應用程序應該使用什么協(xié)議
user用戶名
password密碼
host主機組件標識了因特網上能夠訪問資源的宿主機器,可以有主機名或者是 IP 地址來表示
port端口標識了服務器正在監(jiān)聽的網絡端口。默認端口號是 80
pathURL 的路徑組件說明了資源位于服務器的什么地方
paramsURL 中通過協(xié)議參數來訪問資源,比名值對列表,分號分割來進行訪問
query字符串是通過提問問題或進行查詢來縮小請求資源類的范圍
frag為了引用部分資源或資源的一個片段,比如 URL 指定 HTML 文檔中一個圖片或一個小節(jié)

基本結構

type URL struct {
    Scheme   string    //具體指訪問服務器上的資源使用的哪種協(xié)議
    Opaque   string    // 編碼后的不透明數據
    User     *Userinfo // 用戶名和密碼信息,有些協(xié)議需要傳入明文用戶名和密碼來獲取資源,比如 FTP
    Host     string    // host或host:port,服務器地址,可以是 IP 地址,也可以是域名信息
    Path     string  //路徑,使用"/"分隔
    RawPath    string    // 已編碼的路徑提示(參見EscapedPath方法)
	ForceQuery bool      // 添加一個查詢('?'),即使RawQuery為空
    RawQuery string // 編碼后的查詢字符串,沒有'?'
    Fragment string // 引用的片段(文檔位置),沒有'#'
}

常用方法

地址解析Parse,詳細參數

func main() {
	urlString := "https://admin:passwd@www.baidu.com:80/search?mq=test#12345"
	u, err := url.Parse(urlString)
	if err != nil {
		fmt.Println("parse error ", err)
	}
	fmt.Printf("u type is %T, u is %#v\n", u, u)
	/*
		u type is *url.URL,
		u is &url.URL{
			Scheme:"https", Opaque:"", User:(*url.Userinfo)(0xc000088150),
			Host:"www.baidu.com:80", Path:"/search", RawPath:"", ForceQuery:false,
			RawQuery:"mq=test", Fragment:"12345"
		}

	*/
	fmt.Printf("u.Scheme is %#v\n", u.Scheme) // u.Scheme is "https"
	fmt.Printf("u.Opaque is %#v\n", u.Opaque) // u.Opaque is ""
	fmt.Printf("u.User is %#v\n", u.User)
	// u.User is &url.Userinfo{username:"admin", password:"passwd", passwordSet:true}

	fmt.Printf("u.Host is %#v\n", u.Host)             // u.Host is "www.baidu.com:80"
	fmt.Printf("u.Path is %#v\n", u.Path)             // u.Path is "/search"
	fmt.Printf("u.RawPath is %#v\n", u.RawPath)       // u.RawPath is ""
	fmt.Printf("u.ForceQuery is %#v\n", u.ForceQuery) // u.ForceQuery is false
	fmt.Printf("u.RawQuery is %#v\n", u.RawQuery)     // u.RawQuery is "mq=test"
	fmt.Printf("u.Fragment is %#v\n", u.Fragment)     // u.Fragment is "12345"

}

ParseRequestURI

ParseRequestURI 函數解析 rawurl 為一個 URL 結構體,本函數會假設 rawurl 是在一個 HTTP 請求里,因此會假設該參數是一個絕對 URL 或者絕對路徑,并會假設該 URL 沒有 #fragment 后綴。

func ParseRequestURI(rawurl string) (url *URL, err error)

func main() {
	urlString := "https://admin:passwd@www.baidu.com:80/search?mq=test#12345"
	u, err := url.ParseRequestURI(urlString)
	if err != nil {
		fmt.Println("parse error ", err)
	}
	fmt.Printf("u.Fragment is %#v\n", u.Fragment) // u.Fragment is ""

}

判斷是否是絕對路徑func (*URL) IsAbs

func (u *URL) IsAbs() bool //絕對路徑返回true

func (*URL) Query

Query 方法解析 RawQuery 字段并返回其表示的 Values 類型鍵值對。

func (u *URL) Query() Values 
//map[mq:[test]]

func (*URL) RequestURI

RequestURI 方法返回編碼好的 path?query 或 opaque?query 字符串,用在 HTTP 請求里。

func (u *URL) RequestURI() string
///search?mq=test

func (*URL) String

String 將 URL 重構為一個合法 URL 字符串。

func (u *URL) String() string
//https://admin:passwd@www.baidu.com:80/search?mq=test#12345

func (*URL) Parse

Parse 方法以 u 為上下文來解析一個 URL , ref 可以是絕對或相對 URL。本方法解析失敗會返回 nil , err ;否則返回結果和 ResolveReference 一致。

func main() {

	urlString := "https://www.baidu.com/search?mq=rabbitmq&queue=people#12345"
	u, err := url.Parse(urlString)
	if err != nil {
		fmt.Println("parse error ", err)
	}
	fmt.Printf("u.IsAbs is %#v\n", u.IsAbs()) // u.IsAbs is true
	fmt.Printf("u.Query is %#v\n", u.Query())
	// u.Query is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}
	fmt.Printf("u.RequestURI is %#v\n", u.RequestURI())
	// u.RequestURI is "/search?mq=rabbitmq&queue=people"
	fmt.Printf("u.String is %#v\n", u.String())
	// u.String is "https://www.baidu.com/search?mq=rabbitmq&queue=people#12345"

}

func (*URL) ResolveReference

本方法根據一個絕對 URI 將一個 URI 補全為一個絕對 URI 。參數 ref 可以是絕對 URI 或者相對 URI 。 ResolveReference 總是返回一個新的 URL 實例,即使該實例和 u 或者 ref完全一樣。如果 ref 是絕對 URI ,本方法會忽略參照 URI 并返回 ref 的一個拷貝。

func (u *URL) ResolveReference(ref *URL) *URL

type Values

Values 將建映射到值的列表。它一般用于查詢的參數和表單的屬性。不同于 http.Header 這個字典類型, Values 的鍵是大小寫敏感的。

type Values map[string][]string

func ParseQuery

ParseQuery 函數解析一個 URL 編碼的查詢字符串,并返回可以表示該查詢的 Values 類型的字典。本函數總是返回一個包含了所有合法查詢參數的非 nil 字典, err 用來描述解碼時遇到的(如果有)第一個錯誤。

func ParseQuery(query string) (m Values, err error)
func main() {
	rawUrl := "mq=rabbitmq&queue=people"
	v, err := url.ParseQuery(rawUrl)
	if err != nil {
		fmt.Println("ParseQuery error ", err)
	}
	fmt.Printf("v type is %T, v is %#v\n", v, v)
	// v type is url.Values, v is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}

	// 等價于下面的方法
	urlString := "https://www.baidu.com/search?mq=rabbitmq&queue=people#12345"
	u, _ := url.Parse(urlString)
	queryV := u.Query()
	fmt.Printf("queryV type is %T, queryV is %#v\n", queryV, queryV)
	// queryV type is url.Values, queryV is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}
}

Get、Set、Add、Del、 Encode

//Get 會獲取 key 對應的值集的第一個值。如果沒有對應key的值集會返回空字符串。獲取值集請直接用 map 。
func (v Values) Get(key string) string

//Set 方法將 key 對應的值集設為只有 value ,它會替換掉已有的值集。
func (v Values) Set(key, value string)

//Add 將 value 添加到 key 關聯(lián)的值集里原有的值的后面。
func (v Values) Add(key, value string)

//Del 刪除 key 關聯(lián)的值集
func (v Values) Del(key string)

//Encode 方法將 v 編碼為 ur 編碼格式(“bar=baz&foo=quux”),編碼時會以鍵進行排序
func (v Values) Encode() string

func main() {
	rawUrl := "mq=rabbitmq&queue=people"
	v, err := url.ParseQuery(rawUrl)
	if err != nil {
		fmt.Println("ParseQuery error ", err)
	}
	fmt.Printf("v type is %T, v is %#v\n", v, v)
	// v type is url.Values, v is url.Values{"mq":[]string{"rabbitmq"}, "queue":[]string{"people"}}

	fmt.Println(v.Get("mq")) // rabbitmq
	v.Set("mq", "redis")
	fmt.Println(v.Get("mq")) // redis
	v.Add("name", "wohu")
	fmt.Printf("v is %#v\n", v)
	// v is url.Values{"mq":[]string{"redis"}, "name":[]string{"wohu"}, "queue":[]string{"people"}}

	fmt.Printf("v.Encode is %#v\n", v.Encode()) // v.Encode is "mq=redis&name=wohu&queue=people"
	v.Del("name")
	fmt.Printf("v is %#v\n", v)
	// v is url.Values{"mq":[]string{"redis"}, "queue":[]string{"people"}}
}

查詢轉義:QueryEscape、QueryUnescape

QueryEscape

QueryEscape 函數對 s 進行轉碼使之可以安全的用在 URL 查詢里。

func QueryEscape(s string) string

func QueryUnescape

QueryUnescape 函數用于將 QueryEscape 轉碼的字符串還原。它會把 %AB 改為字節(jié) 0xAB ,將 + 改為空格 。如果有某個 % 后面未跟兩個十六進制數字,本函數會返回錯誤。

func QueryUnescape(s string) (string, error)

func main() {
	rawUrl := "mq=rabbitmq&queue=people"
	stdUrl := url.QueryEscape(rawUrl)
	fmt.Printf("stdUrl is %v\n", stdUrl) // stdUrl is mq%3Drabbitmq%26queue%3Dpeople
	rawurl, _ := url.QueryUnescape(stdUrl)
	fmt.Printf("rawurl is %v\n", rawurl) // rawurl is mq=rabbitmq&queue=people
}

到此這篇關于golang net.url標準庫的具體使用的文章就介紹到這了,更多相關golang net.url標準庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • Go語言實現有規(guī)律的數字版本號的排序工具

    Go語言實現有規(guī)律的數字版本號的排序工具

    這篇文章主要為大家詳細介紹了如何利用Go語言實現有規(guī)律的數字版本號的排序工具,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-01-01
  • golang實現java uuid的序列化方法

    golang實現java uuid的序列化方法

    這篇文章主要介紹了golang實現java uuid的序列化方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • GO開發(fā)編輯器安裝圖文詳解

    GO開發(fā)編輯器安裝圖文詳解

    這篇文章主要介紹了GO開發(fā)編輯器安裝,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Go語言atomic.Value如何不加鎖保證數據線程安全?

    Go語言atomic.Value如何不加鎖保證數據線程安全?

    這篇文章主要介紹了Go語言atomic.Value如何不加鎖保證數據線程安全詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現

    Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現

    這篇文章主要介紹了Go語言json編碼駝峰轉下劃線、下劃線轉駝峰的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Go語言里切片slice的用法介紹

    Go語言里切片slice的用法介紹

    這篇文章介紹了Go語言里切片slice的用法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Go?Interface接口初學者手冊

    Go?Interface接口初學者手冊

    這篇文章主要為大家介紹了Go?Interface接口的基礎用法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang使用sync.singleflight解決熱點緩存穿透問題

    golang使用sync.singleflight解決熱點緩存穿透問題

    在go的sync包中,有一個singleflight包,里面有一個?singleflight.go文件,代碼加注釋,一共200行出頭,通過?singleflight可以很容易實現緩存和去重的效果,避免重復計算,接下來我們就給大家詳細介紹一下sync.singleflight如何解決熱點緩存穿透問題
    2023-07-07
  • 詳解Golang如何實現節(jié)假日不打擾用戶

    詳解Golang如何實現節(jié)假日不打擾用戶

    這篇文章主要為大家介紹了Golang如何實現節(jié)假日不打擾用戶過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 淺談go中defer的一個隱藏功能

    淺談go中defer的一個隱藏功能

    這篇文章主要介紹了淺談go中defer的一個隱藏功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12

最新評論

中阳县| 梁平县| 汉中市| 曲周县| 屯昌县| 汕头市| 循化| 微博| 明光市| 阿城市| 且末县| 华亭县| 长武县| 兴国县| 壶关县| 巴彦县| 罗城| 平原县| 宣汉县| 寿阳县| 华池县| 建阳市| 昌黎县| 汤阴县| 郯城县| 化州市| 电白县| 罗田县| 汉源县| 琼中| 珠海市| 太湖县| 高密市| 满城县| 买车| 扎囊县| 商水县| 安庆市| 长汀县| 舞阳县| 深圳市|