共计 1791 个字符,预计需要花费 5 分钟才能阅读完成。
1. 简介
bytes.buffer 为 go 语言内置提供的一个 字节缓存区。
源码在 src/bytes/buffer.go
// A Buffer 提供了可见的 读,写办法 | |
// 零值是一个空字节 slice. | |
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. | |
} |
二、罕用的办法
1、申明一个 buffer
var b bytes.Buffer // 申明一个 Buffer 变量 | |
b := new(bytes.Buffer) // 应用 New 申明 Buffer 变量 | |
b := bytes.NewBuffer(s []byte) // 从一个 []byte 切片,结构一个 Buffer | |
b := bytes.NewBufferString(s string) // 从一个 string 变量,结构一个 Buffer |
能够通过 b.Grow 来初始化一个 容量大小为 n 的 buffer
// Grow 减少一个 n 长度的 buffer, 当应用 Grow(n) 后,至多能够有 b 个本人,能够写入到 buffer 外面,如果 n 是一个正数,Grow 会 panic,如果 buffer 不能 Grow,会导致 panic 而后报错 ErrTooLarge | |
b.Grow(n int) |
应用案例:
func TestNew(t *testing.T) {b := bytes.Buffer{} | |
b.Grow(100) | |
t.Log(b) // 空字符 | |
b1 := bytes.NewBufferString("hello") | |
t.Log(b1) //hello | |
b2 := bytes.NewBuffer([]byte{'h', 'e', 'l', 'l', 'o'}) | |
t.Log(b2) //hello | |
} |
2、写入一个 buffer
b.Write(d []byte) (n int, err error) // 将切片 d 写入 Buffer 尾部 | |
b.WriteString(s string) (n int, err error) // 将字符串 s 写入 Buffer 尾部 | |
b.WriteByte(c byte) error // 将字符 c 写入 Buffer 尾部 | |
b.WriteRune(r rune) (n int, err error) // 将一个 rune 写入 Buffer 尾部 |
应用案例:
func TestWrite(t *testing.T) { | |
var b bytes.Buffer | |
for i := 0; i < 10; i++ {b.WriteString("hello") | |
} | |
t.Log(b.String()) | |
} |
3、读取一个 buffer
// 从 off 偏移量开始读取 len(p) 长度的字节到 p 中 | |
b.Read(p []byte) (n int, err error) | |
// 读取下一个 byte 并返回,如果没有字节了,而后谬误 io.EOF | |
b.ReadByte() (byte, error) | |
// 读取下一个 UTF8 编码的字符 | |
b.ReadRune() (r rune, size int, err error) | |
// 读取缓冲区第一个分隔符 delim 内容,并且返回从 off 到分隔符 delim 的内容 | |
b.ReadBytes(delim byte) (line []byte, err error) | |
// 读取缓冲区第一个分隔符 delim 内容,并且返回从 off 到分隔符 delim 的内容 | |
b.ReadString(delim byte) (line string, err error) |
应用案例:
func TestRead(t *testing.T) { | |
var b bytes.Buffer | |
for i := 0; i < 10; i++ {b.WriteString("hello") | |
} | |
// 读取到第一个 'o' 之间的字符 | |
s, err := b.ReadString('o') | |
t.Log(s, err) //hello <nil> | |
} |
4、读入到缓存区 / 从缓存区写入
// 从实现了 io.Reader 接口的可读取对象写入 Buffer 尾部 | |
b.ReadFrom(r io.Reader) (n int64, err error) | |
// 将 Buffer 中的内容输入到实现了 io.Writer 接口的可写入对象中,胜利返回写入的字节数,失败返回谬误 | |
b.WriteTo(w io.Writer) (n int64, err error) |
正文完