3

我正在学习围棋,是这个领域的真正新手。

当我尝试复制一些值时,我遇到了问题。

我正在做的是:

  1. 我想使用 httpRequest 在 [response] 中得到一些响应。
httpClient := &http.Client{}
response, err := httpClient.Do(req)
if err != nil {
   panic(err)
}
  1. 之后,我想将存储的值保存在“origin.txt”作为响应
origin_ ,_:= ioutil.ReadAll(response.Body)
f_, err := os.Create("origin.txt")
f_.Write(origin_);
  1. 我想通过使用 goquery 包来获得一个特定的值。
doc, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
    log.Fatal(err)
}
doc.Find(".className").Each(func(i int, s *goquery.Selection) {
    w.WriteString("============" + strconv.Itoa(i) + "============")
    s.Find("tr").Each(func(i int, s_ *goquery.Selection) {
    fmt.Println(s_.Text())
    w.WriteString(s_.Text())    
    })
}

)

但在这种情况下,我可以从 2) 中得到我想要的值,但不能从 3) 中得到任何值。

起初,我认为问题在于,3) 处的响应对象受 2) 动作的影响。因为它是一个参考对象。

所以我试图将它复制到另一个对象,然后再做一次。

origin := *response

但是,我得到了与第一个相同的结果。

我应该怎么办?如何通过值将参考值分配给另一个参考值?

我应该为每次尝试请求两次吗?

4

1 回答 1

6

我实际上看不到您在 2 和 3 之间使用共享资源的位置。

但是,话虽如此,但origin := *response不会给您带来太多收益。数据 ( response.Body) 是一个io.ReadCloser. 将ioutil.ReadAll()消耗并存储流中的所有数据。你只能这样做一次。

但是,您将数据存储在origin. 如果您需要另一个io.Reader用于该数据(例如案例 3),那么您可以使该字节片看起来像一个io.Reader再次:bytes.NewReader(origin)

于 2018-11-16T06:51:01.297 回答