你如何在 Go 中对多个 url 进行 longpoll?

How can you longpoll multiple urls in Go?

这是我目前的情况:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func subscribe(urls Urls) []byte {
    req, err := http.NewRequest("GET", urls.Url, nil)
    if err != nil {
        log.Fatal(err)
    }

    req.Header.Set("authentication", "Bearer " + urls.Token)

    http_client := &http.Client{}
    res, err := http_client.Do(req)
    if err != nil {
        log.Fatal(err)
    }

    defer res.Body.Close()

    resourceResp, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(resourceResp))

    var data map[string]interface{}

    error := json.Unmarshal([]byte(resourceResp), &data)
    if error != nil {
        log.Fatal(error)
    }

    return subscribe(urls)
}

type Urls struct {
    Url string
    Token string
}

func main() {
    var urls [2]Urls

    urls[0] = Urls{
        Url: "https://example.com/users/8",
        Token: "abcdefg",
    }

    urls[1] = Urls{
        Url:   "https://example.com/users/9",
        Token: "hijklmnop",
    }

    subscribe(urls[0])
    subscribe(urls[1])
}

最终目标是 "subscribe" 到多个 url 并提取任何更新的数据(最终将其添加到队列中,但一次一个步骤)。之后,重新建立连接。现在,只有第一个订阅者获得 运行。谢谢!

认为 您要求的 subscribe 函数是 运行 并行的。一种方法是将它们包装在 goroutines 中并等待所有 goroutines 完成:

func main() {
    ...
    ...
    var wg sync.WaitGroup

    wg.Add(len(urls))

    for _, url := range(urls) {
        go func() {
            defer wg.Done()
            subscribe(url)
        }()
    }

    wg.Wait()
}