相关文章推荐
俊逸的青蛙  ·  常见插值算法--拉格朗日插值、三次卷积插值、 ...·  1 年前    · 
温暖的西瓜  ·  连接到 Azure SQL 数据库或 ...·  1 年前    · 
阳刚的太阳  ·  有多少明星英文名叫Jackson?王嘉尔和易 ...·  1 年前    · 
英勇无比的脸盆  ·  开发高质量PDF应用的不二选择:Pdfium ...·  1 年前    · 
力能扛鼎的苦瓜  ·  vue常用指令总结 - 知乎·  1 年前    · 
Code  ›  Golang bytes.Buffer 用法精述开发者社区
golang bytes
https://cloud.tencent.com/developer/article/1456243
焦虑的扁豆
1 年前
作者头像
Dabelv
0 篇文章

Golang bytes.Buffer 用法精述

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > C/C++基础 > Golang bytes.Buffer 用法精述

Golang bytes.Buffer 用法精述

作者头像
Dabelv
发布 于 2019-07-03 17:14:19
12.8K 0
发布 于 2019-07-03 17:14:19
举报

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 main
import (
	"fmt"
	"bytes"
func main() {
    file, _ := os.Open("./test.txt")    
 
推荐文章
俊逸的青蛙  ·  常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值 - Pyrokine - 博客园
1 年前
温暖的西瓜  ·  连接到 Azure SQL 数据库或 Azure SQL 托管实例并进行查询 - SQL Server Management Studio (SSMS) | Microsoft Learn
1 年前
阳刚的太阳  ·  有多少明星英文名叫Jackson?王嘉尔和易烊千玺上榜,看到最后萌化了_网易订阅
1 年前
英勇无比的脸盆  ·  开发高质量PDF应用的不二选择:PdfiumViewer库详细解析-51CTO.COM
1 年前
力能扛鼎的苦瓜  ·  vue常用指令总结 - 知乎
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号