Невозможно отложить закрытие тела запроса - PullRequest
0 голосов
/ 17 октября 2019

Есть идеи, почему я не могу закрыть тело запроса? Запрос возвращает 200 и ошибки нет, но req.Body.Close() выдает ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя

clientHttp := &http.Client{}

req, err := http.NewRequest("GET", "https://example.com/item/"+strconv.FormatInt(itemID, 10), nil)
  if err != nil {
    logrus.Error(err)
    return models.Company{}, err
  }
resp, err := clientHttp.Do(req)
 if err != nil {
    logrus.Error(err)
    return models.Company{}, err
 }

defer req.Body.Close() // <- panic!

Ответы [ 2 ]

8 голосов
/ 17 октября 2019

Приложение должно закрывать тело ответа, а не тело запроса:

defer resp.Body.Close()

Поле req.Body устанавливается из последнего аргумента в http.NewRequest. Поле req.Body равно nil, поскольку последний аргумент http.NewRequest равен nil.

Транспорт закрывает тело запроса (если оно не ноль) в соответствии с документацией для Request.Body :

Для клиентских запросов ноль тела означаетУ запроса нет тела, такого как запрос GET. Транспортный клиент HTTP отвечает за вызов метода Close.

3 голосов
/ 17 октября 2019

req - это запрос GET. У него нет тела, поэтому req.Body равно нулю. Вот почему вы получаете разыменование нулевого указателя. Не закрывайте req.Body.

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