Я написал небольшой сервер, который получает блок данных в виде io.Reader
, добавляет заголовок и передает результат обратно вызывающему.Добавить префикс в io.Reader
Моя реализация не особенно эффективна, так как я буферизую данные blob в памяти, чтобы вычислить длину блоба, которая должна быть частью заголовка.
Я видел несколько примеров io.Pipe()
с io.TeeReader
, но они больше подходят для разделения io.Reader
на две части и записи их параллельно.
Капли я имею дело с около 100KB, поэтому не огромный, но если мой сервер получает занят, память собирается быстро стать проблемой ...
Любые идеи?
func addHeader(in io.Reader) (out io.Reader, err error) {
buf := new(bytes.Buffer)
if _, err = io.Copy(buf, in); err != nil {
return
}
header := bytes.NewReader([]byte(fmt.Sprintf("header:%d", buf.Len())))
return io.MultiReader(header, buf), nil
}
Я ценю это не очень хорошая идея, чтобы вернуть интерфейсы из функций, но этот код не суждено стать API, так что я не слишком обеспокоен, что немного.
Спасибо, что ответ, Cerise. Это io.ReadCloser под обложками, поэтому я думаю, мне просто нужно будет его буферизировать. Ура! – Rob
@Rob io.ReadCloser - это тип интерфейса. Конкретный тип - это нечто другое. Попробуйте 'fmt.Println («% T », in)', чтобы увидеть, что такое конкретный тип. Возможно, это будет один из типов, перечисленных в моем ответе, или тот, который вы можете извлечь из него без чтения. –
А, да, я проверю базовую реализацию и посмотрю, смогу ли я извлечь длину. Огромное спасибо! – Rob