繁体   English   中英

写入Golang缓冲区的开头?

[英]Write to beginning of the buffer in Golang?

我有:

var buffer bytes.Buffer
s := "something to do"
for i := 0; i < 10; i++ {
   buffer.WriteString(s)
}

哪个附加到缓冲区,是否可以写入缓冲区的开头?

由于底层buf未从bytes.Buffer导出,您可以使用:

buffer.WriteString("B")
s := buffer.String()
buffer.Reset()
buffer.WriteString("A")
buffer.WriteString(s)

试试这个围棋游乐场

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var buffer bytes.Buffer
    buffer.WriteString("B")
    s := buffer.String()
    buffer.Reset()
    buffer.WriteString("A" + s)
    fmt.Println(buffer.String())
}

输出:

AB

无法插入到开头,请参阅Amd的“解决方法”的答案。 要在开头覆盖内容,请继续阅读。

请注意,不会导出内部字节切片Buffer.buf ,但方法Buffer.Bytes()返回与Buffer.buf内部切片共享相同后备阵列的切片。

这意味着如果通过调用Bytes.NewBuffer()创建一个新的bytes.Buffer ,并在其重新保持为零长度并保留容量后传递此切片,则可以写入缓冲区的开头, 覆盖第一个缓冲区的原始数据。

看这个例子:

buf := &bytes.Buffer{}
buf.WriteString("Hello  World")
fmt.Println("buf:", buf)

buf2 := bytes.NewBuffer(buf.Bytes()[:0])
buf2.WriteString("Gopher")
fmt.Println("buf:", buf)
fmt.Println("buf2:", buf2)

输出(在Go Playground上试试):

buf: Hello  World
buf: Gopher World
buf2: Gopher

注意:使用此技术,您还可以使用所需的索引而不是0并传递切片来重写任意位置的内容。 例如:

buf := &bytes.Buffer{}
buf.WriteString("Hello  World")
fmt.Println("buf:", buf)

buf2 := bytes.NewBuffer(buf.Bytes()[6:6]) // Start after the "Hello"
buf2.WriteString("Gopher")
fmt.Println("buf:", buf)
fmt.Println("buf2:", buf2)

输出(在Go Playground上试试):

buf: Hello  World
buf: Hello Gopher
buf2: Gopher

请注意,通过Buffer.Bytes()返回的切片对内容的“操作”可能只有在Buffer被修改之后才会成功,之后Buffer可能会分配一个新的后备数组,而你拥有的那个将被“分离”。 (因此对它的进一步修改不会反映在原始Buffer ):

该片仅在下一次缓冲区修改之前有效(即,直到下一次调用Read,Write,Reset或Truncate等方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM