Golang bytes.Buffer 用法精述
发布日期:2021-06-29 19:23:47
浏览次数:2
分类:技术文章
本文共 2552 字,大约阅读时间需要 8 分钟。
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切片,构造一个Bufferb := 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.EOFb.Read(p []byte) (n int, err error)//读取第一个byte并返回,off 向后偏移 nb.ReadByte() (byte, error)//读取第一个 UTF8 编码的字符并返回该字符和该字符的字节数,b的第1个rune被拿掉。如果buffer为空,返回错误 io.EOF,如果不是UTF8编码的字符,则消费一个字节,返回 (U+FFFD,1,nil)b.ReadRune() (r rune, size int, err error)//读取缓冲区第一个分隔符前面的内容以及分隔符并返回,缓冲区会清空读取的内容。如果没有发现分隔符,则返回读取的内容并返回错误io.EOFb.ReadBytes(delimiter byte) (line []byte, err error)//读取缓冲区第一个分隔符前面的内容以及分隔符并作为字符串返回,缓冲区会清空读取的内容。如果没有发现分隔符,则返回读取的内容并返回错误 io.EOFb.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 为负数或大于缓冲区长度,则引发 panicb.UnreadByte() error //将最后一次读取操作中被成功读取的字节设为未被读取的状态,即将已读取的偏移 off 减 1b.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]
[2] [3]转载地址:https://dablelv.blog.csdn.net/article/details/94456479 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月27日 21时08分06秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
TS流分析
2019-04-30
详解YUV420数据格式
2019-04-30
Gstreamer学习笔记(2):GstElement定义、连接
2019-04-30
GStreamer建议的学习步骤和网页链接汇总
2019-04-30
Ubuntu14.04编译安装GStreamer
2019-04-30
GStreamer(一)
2019-04-30
GStreamer(二)
2019-04-30
Gstreamer学习笔记(1):GStreamer Debugging
2019-04-30
bitbake常用命令
2019-04-30
Git学习(一):git 生成 patch的命令
2019-04-30
Gstreamer学习笔记(8):Gobject类对象
2019-04-30
Gstreamer学习笔记(7):plugin注册流程分析(超详细)
2019-04-30
Gstreamer学习笔记(6):如何创建gstreamer插件?
2019-04-30
AVI封装格式解析
2019-04-30
rmvb 文件格式解析
2019-04-30
C语言:setjmp和longjmp函数使用详解
2019-04-30
FFmpeg常用基本命令
2019-04-30
MPG(MPEG2 Program Stream)格式解析
2019-04-30
Gstreamer学习笔记(4):pad定义、连接、流动
2019-04-30