是否可以在缓冲区之上编写?

时间:2015-05-13 10:53:58

标签: go

buff := bytes.NewBuffer(somebytes)

如何在buff之上书写?目前我正在创建一个新的缓冲区。这是正确的方法吗?

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

1 个答案:

答案 0 :(得分:4)

bytes.NewBuffer()返回*Buffer*Buffer实施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{}

如果您要“覆盖”缓冲区的当前内容,可以使用Buffer.Reset()方法或等效的Buffer.Truncate(0)来电。

请注意,重置或截断缓冲区会丢弃内容(或Truncate()的情况下只丢弃一部分内容。但后台保留并重用已分配的缓冲区(字节切片)。

注意:

你真正想做的事情是不可能直接做的:想象一下如果你想在现有内容之前插入一些数据,每次你在它前面写一些东西时都必须改变现有的内容。这不是很有效。

而是在Buffer中创建您的身体。完成后,您将知道您的标题是什么。在另一个Buffer中创建标题,完成后,将正文(从第一个Buffer)复制(写入)到已包含标题的第二个。

或者,如果您不需要存储整个数据,则无需为标题创建第二个Buffer。正文就绪后,将标题写入输出,然后从Buffer写下正文。