1.简介

bytes.Buffer 是 Golang 标准库中的缓冲区,具有读写方法和可变大小的字节存储功能。缓冲区的零值是一个待使用的空缓冲区。定义如下:

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)从 bytes.Buffer 读取数据后,被成功读取的数据仍保留在原缓冲区,只是无法被使用,因为缓冲区的可见数据从偏移 off 开始,即buf[off : len(buf)]。

2.常用方法

(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

(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类型的数据放到缓冲区的尾部
b.ReadFrom(r io.Reader) (n int64, err error)    //从实现了io.Reader接口的可读取对象写入Buffer尾部

(3)从 Buffer 中读取数据。

//读取 n 个字节数据并返回,如果 buffer 不足 n 字节,则读取全部
b.Next(n int) []byte//一次读取 len(p) 个 byte 到 p 中,每次读取新的内容将覆盖p中原来的内容。成功返回实际读取的字节数,off 向后偏移 n,buffer 没有数据返回错误 io.EOF
b.Read(p []byte) (n int, err error)//读取第一个byte并返回,off 向后偏移 n
b.ReadByte() (byte, error)//读取第一个 UTF8 编码的字符并返回该字符和该字符的字节数,b的第1个rune被拿掉。如果buffer为空,返回错误 io.EOF,如果不是UTF8编码的字符,则消费一个字节,返回 (U+FFFD,1,nil)
b.ReadRune() (r rune, size int, err error)//读取缓冲区第一个分隔符前面的内容以及分隔符并返回,缓冲区会清空读取的内容。如果没有发现分隔符,则返回读取的内容并返回错误io.EOF
b.ReadBytes(delimiter byte) (line []byte, err error)//读取缓冲区第一个分隔符前面的内容以及分隔符并作为字符串返回,缓冲区会清空读取的内容。如果没有发现分隔符,则返回读取的内容并返回错误 io.EOF
b.ReadString(delimiter byte) (line string, err error)//将 Buffer 中的内容输出到实现了 io.Writer 接口的可写入对象中,成功返回写入的字节数,失败返回错误
b.WriteTo(w io.Writer) (n int64, err error)

(4)其它操作。

b.Bytes() []byte     //返回字节切片
b.Cap() int             //返回 buffer 内部字节切片的容量
b.Grow(n int)           //为 buffer 内部字节切片的容量增加 n 字节
b.Len() int             //返回缓冲区数据长度,等于 len(b.Bytes())
b.Reset()               //清空数据
b.String() string       //字符串化
b.Truncate(n int)       //丢弃缓冲区中除前n个未读字节以外的所有字节。如果 n 为负数或大于缓冲区长度,则引发 panic
b.UnreadByte() error    //将最后一次读取操作中被成功读取的字节设为未被读取的状态,即将已读取的偏移 off 减 1
b.UnreadRune() error    //将最后一次 ReadRune() 读取操作返回的 UTF8 字符 rune设为未被读取的状态,即将已读取的偏移 off 减去 字符 rune 的字节数

3.使用示例

(1)从文件 test.txt 中读取全部内容追加到 buffer 尾部。
test.txt 的内容为:

My name is dablelv

具体实现:

package mainimport ("os""fmt""bytes"
)func main() {file, _ := os.Open("./test.txt")    buf := bytes.NewBufferString("Hello world ")    buf.ReadFrom(file)              //将text.txt内容追加到缓冲器的尾部    fmt.Println(buf.String())
}

编译运行输出:

Hello world My name is dablelv

参考文献

[1] Golang Package bytes
[2] Golang buffer.go
[3] Golang之缓冲器bytes.Buffer

Golang bytes.Buffer 用法精述相关推荐

  1. golang bytes.buffer 字节缓冲器 简介

    目录 创建 Buffer缓冲器 NewBuffer NewBufferString 向 Buffer 中写入数据 Write WriteString WriteByte WriteRune 完整示例 ...

  2. golang的bytes.buffer

    参考原文:go语言的bytes.buffer 一.创建缓冲期 bytes.buffer是一个缓冲byte类型的缓冲器 1.使用bytes.NewBuffer创建:参数是[]byte的话,缓冲器里就是这 ...

  3. Golang中Buffer高效拼接字符串以及自定义线程安全Buffer

    本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...

  4. golang bytes包 []byte 字节切片 简介

    // 转换// 将 s 中的所有字符修改为大写(小写.标题)格式返回. func ToUpper(s []byte) []byte func ToLower(s []byte) []byte func ...

  5. Go中bytes.Buffer理解

    buffer 前言 最近操作文件,进行优化使用到了buffer.好像也不太了解这个,那么就梳理下,buffer的使用. 例子 我的场景:使用xml拼接了office2003的文档.写入到buffer, ...

  6. Linux sed命令高级用法精讲

    <Linux sed用法详解>一节给大家介绍了如何用 sed 命令的基本功能处理文本中的数据,所涵盖的知识点,可以满足日常大多数文本编辑需求.本节将介绍 sed 提供的一些高级功能,这些功 ...

  7. Go 语言 bytes.Buffer 源码详解之1

    转载地址:Go 语言 bytes.Buffer 源码详解之1 - lifelmy的博客 前言 前面一篇文章 Go语言 strings.Reader 源码详解,我们对 strings 包中的 Reade ...

  8. 微课|玩转Python轻松过二级(2.4节):常用内置函数用法精要2

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第2章  运算符.表达式与内置对象 2.4  Python常用内置函数用法精要 2.4.4  排序与逆序 2 ...

  9. 微课|玩转Python轻松过二级(2.4节):常用内置函数用法精要4

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第2章  运算符.表达式与内置对象 2.4  Python常用内置函数用法精要 2.4.7  range() ...

最新文章

  1. php http put,HTTP PUT方法实例
  2. Kali渗透测试——快速查找Metasploit的模块
  3. 有符号二进制数的乘法
  4. java导入自定义类_导入自定义Java类
  5. 互联网日报 | 4月7日 星期三 | 雷军称小米首款汽车售价10至30万;携程通过港交所上市聆讯;深交所主板与中小板正式合并...
  6. vue中如何在方法中动态的删除集合中的元素!?
  7. Class类和Object类及用法(一)
  8. mysql 出现 quot_mysql 出现 quot;the table is fullquot;的问题 - tmuffamd - ITeye博客
  9. 在VS中查看文件是谁签出的
  10. 【机器学习概率统计】18 隐马尔科夫模型:明暗两条线
  11. ps技巧学习之常用8种抠图方法
  12. HTML-CSS常用元素居中对齐方法
  13. 19.丑数(UVa136)
  14. index函数python查询所有_index函数python查询所有_Python List index()方法
  15. watch gt3 鸿蒙,华为matepad pro2和watchGT3系列即将发布!
  16. wxpython的简单使用【代码实现】
  17. 后端的一个刚毕业的小伙子老早完成了架构和服务端逻辑,接口洋洋洒洒列了出来。。。...
  18. booth乘法器原理
  19. Topit.me:小清新+文艺范的视觉社交平台
  20. java cookie 跨域共享_JavaWeb 系统共享跨域cookie的实现

热门文章

  1. OpenEDR:安全厂商Comodo 开源 EDR 解决方案
  2. 动态规划法(九)想要更多例子? 1
  3. 正则表达式 贪婪与懒惰
  4. 图论--tarjan求lca
  5. dbMigration .NET 数据同步迁移工具
  6. PHP和MySQL Web开发从新手到高手,第9天-总结
  7. lucene索引并搜索mysql数据库[转]
  8. vmclone 问题
  9. 类对象工厂设计模式(Factory Pattern)
  10. 黄聪:C#设置Word中表格某个列宽