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

如何在buff之上書寫?目前我正在創建一個新的緩衝區。這是正確的方式嗎?是否可以在緩衝區上寫入?

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

你想從'somebytes'開始並向它添加(寫入)更多的字節嗎? – icza

+0

在我的代碼中,我實際上只有「buff」;一些字節是buff本身的結果(buff.Bytes),所以我想知道我是隻能使用一個緩衝區還是需要兩個緩衝區。 –

回答

4

bytes.NewBuffer()返回一個*Buffer*Buffer implements io.Writer(和io.Reader),所以你可以通過調用它的Write()WriteString()方法來寫入它。

例子:

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

產量預期(嘗試在Go Playground):

abcdef 

如果你想開始一個空的緩衝區,您可以簡單地創建一個空的Buffer結構(並取其地址):

buff := &bytes.Buffer{} 

如果您想「覆蓋」curr緩衝區的內容,可以使用Buffer.Reset()方法或等效的Buffer.Truncate(0)調用。

注意,重置或截斷緩衝區將丟掉它的內容(或只是其中的一部分在Truncate()情況,但分配的緩衝區(字節片)在後臺保存和再利用。

注:

你真正想要做的事情是不可能的:想象一下,如果你想在現有內容前插入一些數據,現有的內容將不得不在每次寫入/它的效率並不高,

取而代之的是在Buffer中創建你的身體。一旦完成,你就會知道你的標題是什麼。在另一個Buffer中創建標題,完成後,將主體(從第一個Buffer)複製(寫入)到已包含標題的第二個標題中。

或者,如果您不需要存儲整個數據,則不需要爲標題創建第二個Buffer。一旦身體準備就緒,將標題寫入輸出,然後從Buffer中寫出正文。

+0

問題是如何在「abc」上寫「def」。 –

+0

我的用例是我編寫各種數據,並在每次寫入後都跟蹤「依賴關係」。在我寫完所有「body」部分之後,我需要將頭部的所有依賴關係寫在主體(緩衝區)之上。 –

+0

@Theuserwithnohat所以你想在正文之前插入標題?或者標題的空間是保留的,你想稍後填寫(在正文寫完之後)? – icza