中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言的net和url包怎么用

發布時間:2022-05-05 09:11:59 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

這篇文章主要介紹了Go語言的net和url包怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go語言的net和url包怎么用文章都會有所收獲,下面我們一起來看看吧。

引言

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

URL 格式

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

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

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

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

  • user :用戶名;

  • password :密碼;

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

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

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

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

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

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

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

對應 Go 中 URL 的結構體:

type URL struct {
    Scheme      string
    Opaque      string    // encoded opaque data
    User        *Userinfo // username and password information
    Host        string    // host or host:port
    Path        string    // path (relative paths may omit leading slash)
    RawPath     string    // encoded path hint (see EscapedPath method)
    ForceQuery  bool      // append a query ('?') even if RawQuery is empty
    RawQuery    string    // encoded query values, without '?'
    Fragment    string    // fragment for references, without '#'
    RawFragment string    // encoded fragment hint (see EscapedFragment method)
}

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,例如 ParsePathRawpathstring() 所有這些函數我們可以用于不同的目的。

如何使用 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

解析空格

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語言的net和url包怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Go語言的net和url包怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆元县| 津市市| 阳城县| 比如县| 清徐县| 洞口县| 舞钢市| 浦东新区| 武夷山市| 休宁县| 北票市| 家居| 石台县| 蓬溪县| 房山区| 安泽县| 巴东县| 洛扎县| 山丹县| 新巴尔虎左旗| 日照市| 陆河县| 青川县| 丰顺县| 芦溪县| 尚义县| 洛川县| 龙山县| 石狮市| 洮南市| 绩溪县| 和林格尔县| 霸州市| 松潘县| 普兰店市| 康保县| 平武县| 闵行区| 修文县| 偏关县| 绥化市|