使用bytes.Buffer需要注意的地方

316 阅读1分钟
// A Buffer is a variable-sized buffer of bytes with Read and Write methods.
// The zero value for Buffer is an empty buffer ready to use.

type Buffer struct {
    buf      []byte // contents are the bytes buf[off : len(buf)]
    off      int    // read at &buf[off], write at &buf[len(buf)]
    lastRead readOp // last read operation, so that Unread* can work correctly.
}

注意:从 bytes.Buffer 读取数据后,缓冲区的可见数据从偏移 off 开始。

buf.Bytes()方法返回的是buf的引用,而不是原始数据的拷贝,这意味着如果你修改了buf中的数据,那么返回的切片也会受到影响。如果你想要得到原始数据的拷贝,你可以使用copy函数或者bytes包中的Clone函数。

var buf bytes.Buffer
buf.WriteString("hello world")
r := bytes.NewReader(buf.Bytes())
ret, err := io.ReadAll(r)
if err != nil {
    panic(err)
}
fmt.Println(string(ret))
fmt.Println(string(buf.Bytes()))

上面这段代码从buf.Bytes()创建一个新的reader,这样从r读取数据后不会改变原来的bufoff

var buf bytes.Buffer
buf.WriteString("hello world")
r := bufio.NewReader(&buf)
ret, err := io.ReadAll(r)
if err != nil {
	panic(err)
}
fmt.Println(string(ret))
fmt.Println(string(buf.Bytes()))

上面这段代码从buf新建了一个reader,这样从r读取数据后会改变原来的bufoff