io.ReadCloser — интерфейс с методами Read и Close. Очень часто встречается: http.Response.Body это io.ReadCloser, os.File это io.ReadCloser. Суть — данные можно прочитать и потом закрыть ресурс. Если функция принимает io.ReadCloser, она обещает закрыть после чтения (или вызывающий должен). Defer resp.Body.Close() — это потому что Body это ReadCloser. Паттерн: открыл → прочитал → закрыл. Без Close будет утечка ресурсов.