2015-05-13 3 views
-1
buff := bytes.NewBuffer(somebytes) 

Как написать сверху buff? В настоящее время я создаю новый буфер. Правильно ли это?Можно ли написать поверх буфера?

newBuff := bytes.NewBuffer(otherbytes) 
newBuff.ReadFrom(buff) 
+1

Вы хотите начать с 'somebytes' и добавить (написать) к нему больше байтов? – icza

+0

В моем коде у меня на самом деле есть только «buff»; somebytes - результат самого баффа (buff.Bytes), поэтому я задавался вопросом, могу ли я использовать только один буфер или мне нужно два. –

ответ

4

bytes.NewBuffer() возвращает *Buffer. *Buffer реализует io.Writerio.Reader), поэтому вы можете просто написать ему, вызвав его методы Write() или WriteString().

Пример:

somebytes := []byte("abc") 
buff := bytes.NewBuffer(somebytes) 
buff.Write([]byte("def")) 
fmt.Println(buff) 

Выход, как и ожидалось (попробуйте на Go Playground):

abcdef 

Если вы хотите начать с пустого буфера, вы можете просто создать пустой Buffer-структуру (и пройдите по его адресу):

buff := &bytes.Buffer{} 

Если вы хотите «перезаписать» ток в буфере, вы можете использовать метод Buffer.Reset() или эквивалентный вызов Buffer.Truncate(0).

Обратите внимание, что сброс или усечения буфера будет выбрасывать содержимое (или только часть его в случае Truncate(). Но выделенный буфер (байты ломтик) в фоновом режиме сохраняются и используется повторно.

Примечания :

То, что вы действительно хотите сделать, невозможно напрямую: просто представьте, хотите ли вы вставить некоторые данные перед существующим контентом, существующее содержимое нужно будет менять каждый раз, когда вы пишете/вставляете что-то впереди Это не очень эффективно.

Вместо этого создайте свое тело в Buffer. Как только это будет сделано, вы узнаете, каков будет ваш заголовок. Создайте заголовок в другом Buffer, и когда это будет сделано, скопируйте (напишите) тело (с первого Buffer) во второй уже содержащий заголовок.

Если вам не нужно хранить все данные, вам не нужно создавать 2 Buffer для заголовка. Как только тело будет готово, напишите заголовок на ваш выход, а затем напишите тело с Buffer.

+0

Вопрос в том, как написать «def» поверх «abc». –

+0

Мой вариант использования заключается в том, что я пишу различные данные, а также отслеживаю «зависимости» после каждой записи. После того, как я напишу все части тела, мне нужно написать заголовок со всеми зависимостями на вершине тела (буфера). –

+0

@ Theuserwithnohat Итак, вы хотите вставить заголовок перед телом? Или пространство для заголовка зарезервировано, и вы хотите его заполнить позже (после того, как тело было написано)? – icza

Смежные вопросы