Интерфейс io.Reader описывает любой источник данных, из которого можно читать байты:
type Reader interface {
Read(p []byte) (n int, err error)
}Реализуют: *os.File, *bytes.Buffer, strings.Reader, тело HTTP-ответа и т.д. Функции вроде io.Copy, io.ReadAll принимают io.Reader, поэтому один и тот же код работает с файлами, сетью и памятью.