golng fetching url и resp.Body.Close () - PullRequest
       0

golng fetching url и resp.Body.Close ()

0 голосов
/ 20 октября 2018

Я ищу код go для извлечения URL-адреса, и в большинстве случаев это код для извлечения URL-адреса на ходу:

func main() {
    for _, url := range os.Args[1:] {
        resp, err := http.Get(url)
        if err != nil {
            fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
            os.Exit(1)
        }
        b, err := ioutil.ReadAll(resp.Body)
        resp.Body.Close()
        if err != nil {
            fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
            os.Exit(1)
        }
        fmt.Printf("%s", b)
    }
}

мой вопрос, зачем здесь нужен resp.Body.Close () и whayэто точно делает?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

когда вы используете ioutil.ReadAll, вы вызываете функцию Read для response.Body.То, что это делает, устанавливает "ищущий", который читает содержимое response.Body и возвращает буфер, содержащий это.Когда вы Close response.Body, вы сбрасываете эту позицию «искателя» в ноль и возвращаете соединение tcp в пул соединений.Это гарантирует, что любые будущие чтения, которые вы можете выполнить с этим ответом, начнутся с нуля, в отличие от EOF, и гарантируют, что нет невозвращенного соединения tcp, ожидающего чтения.

0 голосов
/ 20 октября 2018

Если вы покопаетесь в http-документах https://golang.org/pkg/net/http/

Метод Get, используемый для создания ответа, - это Ответ

 func (c *Client) Get(url string) (resp *Response, err error)

В источнике ответа:

        // Body represents the response body.
        //
        // The response body is streamed on demand as the Body field
        // is read. If the network connection fails or the server
        // terminates the response, Body.Read calls return an error.
        //
        // The http Client and Transport guarantee that Body is always
        // non-nil, even on responses without a body or responses with
        // a zero-length body. It is the caller's responsibility to
        // close Body. The default HTTP client's Transport may not
        // reuse HTTP/1.x "keep-alive" TCP connections if the Body is
        // not read to completion and closed.
        //
        // The Body is automatically dechunked if the server replied
        // with a "chunked" Transfer-Encoding.
        Body io.ReadCloser

Так что Close () приводит в порядок ресурсы, которые используются для получения тела

Если этого не сделать, Response (соответственно) не сможет выполнить "keep-alive", и ядумаю, есть вероятность, что некоторые ресурсы в ответе не смогут быть переработаны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...