Golang bytes.Buffer 用法精述
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 用法精述相关推荐
- golang bytes.buffer 字节缓冲器 简介
目录 创建 Buffer缓冲器 NewBuffer NewBufferString 向 Buffer 中写入数据 Write WriteString WriteByte WriteRune 完整示例 ...
- golang的bytes.buffer
参考原文:go语言的bytes.buffer 一.创建缓冲期 bytes.buffer是一个缓冲byte类型的缓冲器 1.使用bytes.NewBuffer创建:参数是[]byte的话,缓冲器里就是这 ...
- Golang中Buffer高效拼接字符串以及自定义线程安全Buffer
本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...
- golang bytes包 []byte 字节切片 简介
// 转换// 将 s 中的所有字符修改为大写(小写.标题)格式返回. func ToUpper(s []byte) []byte func ToLower(s []byte) []byte func ...
- Go中bytes.Buffer理解
buffer 前言 最近操作文件,进行优化使用到了buffer.好像也不太了解这个,那么就梳理下,buffer的使用. 例子 我的场景:使用xml拼接了office2003的文档.写入到buffer, ...
- Linux sed命令高级用法精讲
<Linux sed用法详解>一节给大家介绍了如何用 sed 命令的基本功能处理文本中的数据,所涵盖的知识点,可以满足日常大多数文本编辑需求.本节将介绍 sed 提供的一些高级功能,这些功 ...
- Go 语言 bytes.Buffer 源码详解之1
转载地址:Go 语言 bytes.Buffer 源码详解之1 - lifelmy的博客 前言 前面一篇文章 Go语言 strings.Reader 源码详解,我们对 strings 包中的 Reade ...
- 微课|玩转Python轻松过二级(2.4节):常用内置函数用法精要2
适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第2章 运算符.表达式与内置对象 2.4 Python常用内置函数用法精要 2.4.4 排序与逆序 2 ...
- 微课|玩转Python轻松过二级(2.4节):常用内置函数用法精要4
适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第2章 运算符.表达式与内置对象 2.4 Python常用内置函数用法精要 2.4.7 range() ...
最新文章
- php http put,HTTP PUT方法实例
- Kali渗透测试——快速查找Metasploit的模块
- 有符号二进制数的乘法
- java导入自定义类_导入自定义Java类
- 互联网日报 | 4月7日 星期三 | 雷军称小米首款汽车售价10至30万;携程通过港交所上市聆讯;深交所主板与中小板正式合并...
- vue中如何在方法中动态的删除集合中的元素!?
- Class类和Object类及用法(一)
- mysql 出现 quot_mysql 出现 quot;the table is fullquot;的问题 - tmuffamd - ITeye博客
- 在VS中查看文件是谁签出的
- 【机器学习概率统计】18 隐马尔科夫模型:明暗两条线
- ps技巧学习之常用8种抠图方法
- HTML-CSS常用元素居中对齐方法
- 19.丑数(UVa136)
- index函数python查询所有_index函数python查询所有_Python List index()方法
- watch gt3 鸿蒙,华为matepad pro2和watchGT3系列即将发布!
- wxpython的简单使用【代码实现】
- 后端的一个刚毕业的小伙子老早完成了架构和服务端逻辑,接口洋洋洒洒列了出来。。。...
- booth乘法器原理
- Topit.me:小清新+文艺范的视觉社交平台
- java cookie 跨域共享_JavaWeb 系统共享跨域cookie的实现