1、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)
}
type URL struct {
Scheme string // http或https協議
Opaque string // 編碼不透明數據
User *Userinfo // 用戶名密碼信息--例如FTP需要帶着用戶名密碼訪問
Host string // 主機或主機:端口
Path string // 路徑(相對路徑可以省略前導斜線)
RawPath string // 編碼路徑
ForceQuery bool // 即使沒有請求參數也會強制添加 ? 號
RawQuery string // 編碼不帶 ? 號的請求參數
Fragment string // 不帶 # 號的引用片段
RawFragment string // 編碼引用片段
}
2、解析給定的URL
package main
import (
"fmt"
"net/url"
)
func main() {
rawUrl := "https://pkg.go.dev/net/url?a=b&c=d#example-ParseQuery"
uri, err := url.Parse(rawUrl)
if err != nil {
return
}
fmt.Println(fmt.Sprintf("解析后的URL是:%#v", uri))
}

3、拼接query參數構建URL
package main
import (
"fmt"
"net/url"
)
func main1() {
rawUrl := "https://pkg.go.dev/net/url?a=b&c=d#example-ParseQuery"
uri, err := url.Parse(rawUrl)
if err != nil {
return
}
fmt.Println(fmt.Sprintf("解析后的URL是:%#v", uri))
}
func main() {
//創建 https://pkg.go.dev/net/url?a=b&b=d#example-ParseQuery
u := url.URL{}
u.Scheme = "https"
u.Host = "pkg.go.dev"
u.Path = "/net/url"
values := url.Values{} //拼接query參數
values.Add("a", "b")
values.Add("b", "d")
u.RawQuery = values.Encode()
u.Fragment = "example-ParseQuery"
fmt.Println(fmt.Sprintf("URL是:%s", u.String()))
}

4、修改請求路徑和參數
package main
import (
"fmt"
"net/url"
"path"
)
func main() {
rawUrl := "https://pkg.go.dev/net/url?a=b&c=d#example-ParseQuery"
uri, err := url.Parse(rawUrl)
if err != nil {
return
}
v := url.Values{}
v.Add("a", "c")
v.Add("c", "b")
uri.RawQuery = v.Encode()
uri.Path = path.Join(uri.Path, "/ccc/ddd")
fmt.Println(fmt.Sprintf("修改后的URL是:%s", uri))
}
