resp.Body содержит только байты и ничего более.
Вы можете в зависимости от статуса ответа сервера resp.Status, выбирать, как вам обрабатывать данные.
Например, у меня в проектах сделано так:
Когда статус запроса 200, я декодирую его как обычно.
Если статус другой, я ожидаю, что он будет содержать другую структуру, в которой будет описание ошибки и пытаюсь его декодировать в эту структуру и возвращаю как ошибку.
Но если декодирование ошибки не удалось, то я просто возвращаю ошибку, содержащую текст Body.