当前位置: 技术文章>> 100道Go语言面试题之-Go语言的net/url包是如何解析和构建URL的?请给出使用示例。
文章标题:100道Go语言面试题之-Go语言的net/url包是如何解析和构建URL的?请给出使用示例。
在Go语言中,`net/url` 包是用于解析URL和构建查询参数的非常有用的库。这个包提供了 `URL` 结构体,它表示了一个解析后的URL,并提供了方法来构建和修改URL。
### 解析URL
使用 `url.Parse` 或 `url.ParseRequestURI` 函数可以解析URL字符串。`url.Parse` 是最常用的函数,它接受一个URL字符串和一个可选的基础URL(用于解析相对URL)。`url.ParseRequestURI` 用于解析请求URI,它不会将查询参数解析为map,而是将它们作为路径的一部分返回。
#### 示例:使用 `url.Parse`
```go
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
```go
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的片段部分(即井号`#`后面的部分)。