GO 构造 URL 和 解析 URL

构造url

package main

import (
    "fmt"
    "net/url"
)

func main() {
    u := url.URL{}
    u.Scheme = "https"
    u.Host = "go.dev"
    u.Path = "/learn/doc"

    values := u.Query()
    values.Add("hello", "world")

    u.RawQuery = values.Encode()

    fmt.Printf("URL = %s\n", u.String())
}

// $ go run main.go
// 输出如下
/**
  URL = https://go.dev/learn/doc?hello=world
*/

解析url

package main

import (
    "fmt"
    "net/url"
)

func main() {
    s := "https://golang.org"

    u, err := url.Parse(s)
    if err != nil {
        panic(err)
    }

    fmt.Println(u.Scheme)
    fmt.Println(u.Host)
}

// $ go run main.go
// 输出如下
/**
  https
  golang.org
*/

解析带参数url

package main

import (
    "fmt"
    "net/url"
)

func main() {
    s := "https://go.dev/learn/doc?hello=world"
    u, err := url.Parse(s)
    if err != nil {
        panic(err)
    }

    fmt.Println(u.Scheme)
    fmt.Println(u.Host)
    fmt.Println(u.Path)

    fmt.Printf("Param hello = %s\n", u.Query().Get("hello"))
}

// $ go run main.go
// 输出如下
/**
  https
  go.dev
  /learn/doc
  Param hello = world
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,需要先明确需要调用的分页接口的具体请求参数和返回值。假设我们要调用的分页接口请求参数为 `page` 和 `size`,返回值为一个包含多个数据项的 JSON 数组。 接下来,我们可以使用 Go 语言内置的 `sync` 包来实现多线程调用分页接口。具体步骤如下: 1. 创建一个等待所有线程完成的 `WaitGroup` 对象。 ```go var wg sync.WaitGroup ``` 2. 定义一个结构体来存储每个线程需要的参数。 ```go type ThreadParams struct { Page int Size int } ``` 3. 定义一个函数来执行每个线程的具体任务,该函数需要接收一个 `ThreadParams` 参数,并在完成任务后将 `WaitGroup` 对象中的计数器减一。 ```go func getPage(params ThreadParams) { defer wg.Done() // 构造请求参数 reqParams := url.Values{} reqParams.Set("page", strconv.Itoa(params.Page)) reqParams.Set("size", strconv.Itoa(params.Size)) // 发送 HTTP 请求获取数据 resp, err := http.Get("https://example.com/api?" + reqParams.Encode()) if err != nil { log.Println(err) return } // 解析 JSON 响应 defer resp.Body.Close() var data []interface{} err = json.NewDecoder(resp.Body).Decode(&data) if err != nil { log.Println(err) return } // 处理数据 for _, item := range data { // TODO: 处理数据项 } } ``` 4. 创建多个线程,并将每个线程的参数传递给 `getPage` 函数。 ```go pageSize := 10 totalPages := 5 for i := 1; i <= totalPages; i++ { wg.Add(1) go getPage(ThreadParams{Page: i, Size: pageSize}) } ``` 5. 等待所有线程完成。 ```go wg.Wait() ``` 完整代码示例: ```go package main import ( "encoding/json" "log" "net/http" "net/url" "strconv" "sync" ) type ThreadParams struct { Page int Size int } func getPage(params ThreadParams) { defer wg.Done() // 构造请求参数 reqParams := url.Values{} reqParams.Set("page", strconv.Itoa(params.Page)) reqParams.Set("size", strconv.Itoa(params.Size)) // 发送 HTTP 请求获取数据 resp, err := http.Get("https://example.com/api?" + reqParams.Encode()) if err != nil { log.Println(err) return } // 解析 JSON 响应 defer resp.Body.Close() var data []interface{} err = json.NewDecoder(resp.Body).Decode(&data) if err != nil { log.Println(err) return } // 处理数据 for _, item := range data { // TODO: 处理数据项 } } var wg sync.WaitGroup func main() { pageSize := 10 totalPages := 5 for i := 1; i <= totalPages; i++ { wg.Add(1) go getPage(ThreadParams{Page: i, Size: pageSize}) } wg.Wait() } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laravel技术社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值