io.Copy(dst, src) копирует данные порциями (32 КБ), не загружая весь поток в память. Подходит для больших или неограниченных объемов.
io.ReadAll(r) читает весь поток до io.EOF и возвращает один []byte. Уместен, когда объем ограничен (например, короткий HTTP-ответ). Использовать на потенциально большом потоке рискованно: возможен OOM.