Go 語言入門很簡單:net/url 包

      網友投稿 1992 2025-04-02

      引言


      在 Golang 中,將 URL 打包用于從服務器獲取數據非常重要。只需了解您是否正在處理任何應用程序并且您想從任何外部位置或服務器獲取此應用程序的數據,都需要我們可以使用 URL。

      URL 格式

      URL 包含各種參數:例如 端口、URL 中的搜索字符串等。 URL 可以包含各種方法,允許它處理 URL 屬性和進行修改,例如,如果我們有一個類似的 URL www.exmple.com:3000 ,3000 是 URL 的端口,借助 net/url 中的封裝函數我們可以訪問端口號,同理,還可以檢查 URL 格式是否有效。

      先來看一下常見 URL 的格式:

      ://:@:/:?#

      scheme?: 方案是如何訪問指定資源的主要標識符,他會告訴負責解析?URL?應用程序應該使用什么協議;

      user?:用戶名;

      password?:密碼;

      host?: 主機組件標識了因特網上能夠訪問資源的宿主機器,可以有主機名或者是?IP?地址來表示;

      port?: 端口標識了服務器正在監聽的網絡端口。默認端口號是 80;

      path?:?URL?的路徑組件說明了資源位于服務器的什么地方;

      params?:?URL?中通過協議參數來訪問資源,比名值對列表,分號分割來進行訪問;

      query?: 字符串是通過提問問題或進行查詢來縮小請求資源類的范圍;

      frag?: 為了引用部分資源或資源的一個片段,比如?URL?指定?HTML?文檔中一個圖片或一個小節;

      HTTP?通常只處理整個對象,而不是對象的片段,客戶端不能將片段傳送給服務器。瀏覽器從服務器獲取整個資源之后,會根據片段來顯示你感興趣的片段部分。

      Go url 包函數使用格式

      Go 的 net/url 提供了眾多處理 URL 的內置函數,這些函數的使用格式如下:

      URL, error := url.inbuilt-function-name("url")

      URL:這包含 URL 名稱和 URL 的一些基本細節。我們可以給它起任何名字。它就像任何變量一樣。

      error: 這是 error 部分,以防 URL 錯誤或出現任何異常,在這種情況下 URL 將返回錯誤,并且該 error 將在 error 部分中捕獲。

      inbuilt-function-name:正如我們所討論的,URL 包中有許多函數可以處理 URL,例如 Parse、Path、Rawpath、string() 所有這些函數我們可以用于不同的目的。

      如何使用 URL 包

      在了解 url 包的工作原理之前我們需要了解基本的使用。當我們點擊任何 url 時,它可以包含許多屬性,比如它可以有一些端口、它可以有一些搜索、它可以有一些路徑等,所以我們使用 URL 來操作和處理所有這些東西。讓我們了解一下 go 語言中 URL 包 的工作原理

      package main import ( "fmt" "log" "net/url" ) func TestURL() { URL, err := url.Parse("https://www.baidu.com/s?wd=golang") fmt.Println("Url before modification is", URL) if err != nil { log.Fatal("An error occurs while handling url", err) } URL.Scheme = "https" URL.Host = "bing.com" query := URL.Query() query.Set("q", "go") URL.RawQuery = query.Encode() fmt.Println("The url after modification is", URL) } func main() { TestURL() }

      運行結果:

      $ go run main.go Url before modification is https://www.baidu.com/s?wd=golang The url after modification is https://bing.com/s?q=go&wd=golang

      在 Golang 中對查詢字符串進行 URL 編碼

      Go 的 net/url 包包含一個名為 QueryEscape 的內置方法,用于對字符串進行轉義/編碼,以便可以安全地將其放置在 URL 查詢中。以下示例演示了如何在 Golang 中對查詢字符串進行編碼:

      package main import ( "fmt" "net/url" ) func main() { query := "hello world" fmt.Println(url.QueryEscape(query)) }

      運行結果:

      $ go run main.go Hello+World

      在 Golang 中對多個查詢參數進行 URL 編碼

      如果您想一次編碼多個查詢參數,那么您可以創建一個 url.Values 結構,其中包含查詢參數到值的映射,并使用 url.Values.Encode() 方法對所有查詢參數進行編碼。

      package main import ( "fmt" "net/url" ) func main() { params := url.Values{} params.Add("name", "@Wade") params.Add("phone", "+111111111111") fmt.Println(params.Encode()) }

      運行代碼:

      $ go run main.go name=%40Wade&phone=%2B111111111111

      在 Golang 中對路徑段進行 URL 編碼

      就像 QueryEscape 一樣,Go 中的 net/url 包有另一個名為 PathEscape() 的函數來對字符串進行編碼,以便它可以安全地放置在 URL 的路徑段中:

      package main import ( "fmt" "net/url" ) func main() { path := "path with?reserved+characters" fmt.Println(url.PathEscape(path)) }

      運行結果:

      $ go run main.go path%20with%3Freserved+characters

      通過對各個部分進行編碼來構建完整的 URL

      最后,我們來看一個完整的 Golang 中 URL 解析和 URL 編碼的例子:

      package main import ( "fmt" "net/url" ) func main() { // Let's start with a base url baseUrl, err := url.Parse("http://www.bing.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", "@wade") // Add Query Parameters to the URL baseUrl.RawQuery = params.Encode() // Escape Query Parameters fmt.Printf("Encoded URL is %q\n", baseUrl.String()) }

      運行代碼:

      $ go run main.go Encoded URL is "http://www.bing.com/path%20with%3Freserved%20characters?q=Hello+World&u=%40wade"

      在 Golang 中解析 URL

      package main import ( "fmt" "log" "net/url" ) func TestURL() { URL, err := url.Parse("http://bing.com/good%2bad") fmt.Println("Url before modification is", URL) if err != nil { log.Fatal("An error occurs while handling url", err) } fmt.Println("The URL path is", URL.Path) fmt.Println("The URL raw path is", URL.RawPath) fmt.Println("The URL is ", URL.String()) } func main() { TestURL() }

      運行代碼:

      $ go run main.go Url before modification is http://bing.com/good%2bad The URL path is /good+ad The URL raw path is /good%2bad The URL is http://bing.com/good%2bad

      處理相對路徑

      package main import ( "fmt" "log" "net/url" ) func ExampleURL() { URL, error := url.Parse("../../..//search?q=php") fmt.Println("Url before modification is", URL) if error != nil { log.Fatal("An error occurs while handling url", error) } baseURL, err := url.Parse("http://example.com/directory/") if err != nil { log.Fatal("An error occurs while handling url", err) } fmt.Println(baseURL.ResolveReference(URL)) } func main() { ExampleURL() }

      $ go run main.go Url before modification is ../../..//search?q=php http://example.com/search?q=php

      Go 語言入門很簡單:net/url 包

      解析空格

      package main import ( "fmt" "log" "net/url" ) func ExampleURL() { URL, error := url.Parse("http://example.com/Here path with space") if error != nil { log.Fatal("An error occurs while handling url", error) } fmt.Println("The Url is", URL) } func main() { ExampleURL() }

      運行結果:

      $ go run main.go The Url is http://example.com/Here%20path%20with%20space

      判斷絕對地址

      package main import ( "fmt" "net/url" ) func main() { u := url.URL{Host: "example.com", Path: "foo"} fmt.Println("The Url is", u.IsAbs()) u.Scheme = "http" fmt.Println("The Url is", u.IsAbs()) }

      $ go run main.go The Url is false The Url is true

      解析端口

      package main import ( "fmt" "log" "net/url" ) func ExampleURL() { URL1, error := url.Parse("https://example.org") fmt.Println("URL1 before modification is", URL1) if error != nil { log.Fatal("An error occurs while handling url", error) } URL2, err := url.Parse("https://example.org:8080") if err != nil { log.Fatal("An error occurs while handling url", URL2) } fmt.Println("URL2 before modification is", URL2) fmt.Println("URL2 Port number is", URL2.Port()) } func main() { ExampleURL() }

      $ go run main.go URL1 before modification is https://example.org URL2 before modification is https://example.org:8080 URL2 Port number is 8080

      總結

      從本教程中,我們了解了 go url 包 的基本概念,并了解了 url 的概念語法。并逐漸展示了 url 的部分功能以及 url 的主要用途,希望讀者可以在官方文檔中學習其他方法。

      參考鏈接 :https://pkg.go.dev/net/url

      Go

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Redis項目中如何用的,如何實現高可用
      下一篇:客服接待人員的崗位職責是什么?客服接待人員的接待流程
      相關文章
      亚洲av无码日韩av无码网站冲| 国产精品亚洲综合一区| 久久久久久亚洲精品无码| 久久亚洲中文字幕精品有坂深雪| 最新亚洲成av人免费看| 亚洲国产高清在线一区二区三区| 国产精品亚洲专区无码牛牛| 亚洲国产日韩a在线播放| 亚洲一区AV无码少妇电影| 久久精品国产99国产精品亚洲| 亚洲最大在线观看| 亚洲国产日产无码精品| 亚洲日产2021三区| 亚洲午夜国产精品| 亚洲乱码一二三四区乱码| 亚洲www在线观看| 亚洲一线产品二线产品| 亚洲乱理伦片在线观看中字| 亚洲欧美日韩自偷自拍| 亚洲av无码专区在线电影| 久久精品国产亚洲av天美18| 久久精品亚洲日本波多野结衣| 国产成人久久精品亚洲小说| 亚洲av午夜成人片精品电影| 亚洲精品尤物yw在线影院| 国产亚洲精品国看不卡| 精品亚洲综合久久中文字幕| 久久亚洲成a人片| 78成人精品电影在线播放日韩精品电影一区亚洲| 亚洲精品综合一二三区在线| 亚洲av丰满熟妇在线播放| 亚洲欧洲在线观看| 亚洲国产成人精品无码区在线秒播 | 亚洲视频日韩视频| 亚洲中文字幕久在线| 亚洲日韩AV一区二区三区四区 | 亚洲区日韩精品中文字幕| 在线观看亚洲免费视频| 久久激情亚洲精品无码?V| 亚洲AV永久无码精品水牛影视| 亚洲免费在线视频|