Как описать структуру входных данных?
resp.Body содержит только байты и ничего более.

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

type := resp.Header.Get("Content-Type")