在Go语言中,net/url
包是用于解析URL和构建查询参数的非常有用的库。这个包提供了 URL
结构体,它表示了一个解析后的URL,并提供了方法来构建和修改URL。
解析URL
使用 url.Parse
或 url.ParseRequestURI
函数可以解析URL字符串。url.Parse
是最常用的函数,它接受一个URL字符串和一个可选的基础URL(用于解析相对URL)。url.ParseRequestURI
用于解析请求URI,它不会将查询参数解析为map,而是将它们作为路径的一部分返回。
示例:使用 url.Parse
package main
import (
"fmt"
"net/url"
)
func main() {
rawURL := "http://example.com/path?query=123#fragment"
parsedURL, err := url.Parse(rawURL)
if err != nil {
panic(err)
}
fmt.Println("Scheme:", parsedURL.Scheme)
fmt.Println("Host:", parsedURL.Host)
fmt.Println("Path:", parsedURL.Path)
fmt.Println("Raw Query:", parsedURL.RawQuery)
fmt.Println("Fragment:", parsedURL.Fragment)
// 解析查询参数
queryParams := parsedURL.Query()
fmt.Println("Query Params:", queryParams.Get("query"))
}
构建URL
虽然 net/url
包没有直接提供一个函数来从头开始构建完整的URL字符串,但你可以通过操作 URL
结构体和它的方法来构建URL。
示例:构建URL
package main
import (
"fmt"
"net/url"
)
func main() {
// 初始化URL
base := &url.URL{
Scheme: "http",
Host: "example.com",
Path: "/path",
}
// 添加查询参数
query := url.Values{}
query.Set("query", "123")
query.Add("another", "value")
base.RawQuery = query.Encode()
// 添加片段
base.Fragment = "fragment"
// 构建完整的URL字符串
fullURL := base.String()
fmt.Println(fullURL) // 输出: http://example.com/path?query=123&another=value#fragment
}
注意事项
- 当使用
url.Parse
时,如果URL是相对的(即没有协议方案),你需要提供一个基础URL(base URL)作为第二个参数。 url.Values
是一个map[string][]string
的封装,它允许你存储多个具有相同键的值。Query()
方法返回url.Values
类型的值,它表示URL的查询参数。- 使用
RawQuery
字段可以获取或设置查询字符串的原始表示(未经解析的)。 Fragment
字段表示URL的片段部分(即井号#
后面的部分)。