0
点赞
收藏
分享

微信扫一扫

go bytes.buffer 介绍以及使用案例



阅读目录

  • 一、简介
  • 二、常用的方法
  • 1、申明一个buffer
  • 2、写入一个buffer
  • 3、读取一个buffer
  • 4、读入到缓存区/从缓存区写入


一、简介

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尾部

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)

使用案例:

//写入到文件中
func TestWriteTo(t *testing.T) {
    b := bytes.NewBufferString("hello,world")
    f, _ := os.Create("hi.txt")
    defer f.Close()
    _, _ = b.WriteTo(f)
}

//从文件中读取
func TestReadFrom(t *testing.T) {
    b := bytes.NewBufferString("")
    f, _ := os.Open("hi.txt")
    defer f.Close()
    _, _ = b.ReadFrom(f)
    t.Log(b.String())   //hello,world
}


举报

相关推荐

0 条评论