golang的bytes.buffer
参考原文:go语言的bytes.buffer
一、创建缓冲期
bytes.buffer是一个缓冲byte类型的缓冲器
1、使用bytes.NewBuffer创建:参数是[]byte的话,缓冲器里就是这个slice的内容;如果参数是nil的话,就是创建一个空的缓冲器。
2、bytes.NewBufferString创建
3、bytes.Buffer{}
func main(){
buf1 := bytes.NewBufferString("hello")
buf2 := bytes.NewBuffer([]byte("hello"))
buf3 := bytes.NewBuffer([]byte{'h','e','l','l','o'})
以上三者等效,输出//hello
buf4 := bytes.NewBufferString("")
buf5 := bytes.NewBuffer([]byte{})
以上两者等效,输出//""
fmt.Println(buf1.String(),buf2.String(),buf3.String(),buf4,buf5,1)
}复制代码
二、写入到缓冲器
如果buffer在new的时候是空的,可以用Write在尾部写入
1、Write方法,将一个byte类型的slice放到缓冲器的尾部
//func (b *Buffer) Write(p []byte) (n int,err error)
func main(){
s := []byte(" world")
buf := bytes.NewBufferString("hello")
fmt.Println(buf.String()) //hello
buf.Write(s) //将s这个slice添加到buf的尾部
fmt.Println(buf.String()) //hello world
}
复制代码
2、WriteString方法,把一个字符串放到缓冲器的尾部
//func (b *Buffer) WriteString(s string)(n int,err error)
func main(){
s := " world"
buf := bytes.NewBufferString("hello")
fmt.Println(buf.String()) //hello
buf.WriteString(s) //将string写入到buf的尾部
fmt.Println(buf.String()) //hello world
}
复制代码
3、WriteByte方法,将一个byte类型的数据放到缓冲器的尾部
//func (b *Buffer) WriteByte(c byte) error
func main(){
var s byte = '?'
buf := bytes.NewBufferString("hello")
fmt.Println(buf.String()) //把buf的内容转换为string,hello
buf.WriteByte(s) //将s写到buf的尾部
fmt.Println(buf.String()) //hello?
}复制代码
4、WriteRune方法,将一个rune类型的数据放到缓冲器的尾部
// func (b *Buffer) WriteRune(r Rune) (n int,err error)
func main(){
var s rune = '好'
buf := bytes.NewBufferString("hello")
fmt.Println(buf.String()) //hello
buf.WriteRune(s)
fmt.Println(buf.String()) //hello好
}复制代码
三、从缓冲器写出
WriteTo方法,将一个缓冲器的数据写到w里,w是实现io.Writer的,比如os.File
func main(){
file,_ := os.Create("text.txt")
buf := bytes.NewBufferString("hello world")
buf.WriteTo(file)
//或者使用写入,fmt.Fprintf(file,buf.String())
}复制代码
四、读出缓冲器
1、Read方法,给Read方法一个容器,读完后p就满了,缓冲器相应的减少。
// func (b *Buffer) Read(p []byte)(n int,err error)
func main(){
s1 := []byte("hello")
buff := bytes.NewBuffer(s1)
s2 := []byte(" world")
buff.Write(s2)
fmt.Println(buff.String()) //hello world
s3 := make([]byte,3)
buff.Read(s3) //把buff的内容读入到s3,s3的容量为3,读了3个过来
fmt.Println(buff.String()) //lo world
fmt.Println(string(s3)) //hel
buff.Read(s3) //继续读入3个,原来的被覆盖
fmt.Println(buff.String()) //world
fmt.Println(string(s3)) //"lo "
}
复制代码
2、ReadByte方法,返回缓冲器头部的第一个byte,缓冲器头部第一个byte取出
//func (b *Buffer) ReadByte() (c byte,err error)
func main(){
buf := bytes.NewBufferString("hello")
fmt.Println(buf.String())
b,_ := buf.ReadByte() //取出第一个byte,赋值给b
fmt.Println(buf.String()) //ello
fmt.Println(string(b)) //h
}
复制代码
3、ReadRune方法,返回缓冲器头部的第一个rune
// func (b *Buffer) ReadRune() (r rune,size int,err error)
func main(){
buf := bytes.NewBufferString("你好smith")
fmt.Println(buf.String())
b,n,_ := buf.ReadRune() //取出第一个rune
fmt.Println(buf.String()) //好smith
fmt.Println(string(b)) //你
fmt.Println(n) //3,"你“作为utf8存储占3个byte
b,n,_ = buf.ReadRune() //再取出一个rune
fmt.Println(buf.String()) //smith
fmt.Println(string(b)) //好
fmt.Println(n) //3
}
复制代码
4、ReadBytes方法,需要一个byte作为分隔符,读的时候从缓冲器里找出第一个出现的分隔符,缓冲器头部开始到分隔符之间的byte返回。
//func (b *Buffer) ReadBytes(delim byte) (line []byte,err error)
func main(){
var d byte = 'e' //分隔符
buf := bytes.NewBufferString("你好esmieth")
fmt.Println(buf.String()) //你好esmieth
b,_ := buf.ReadBytes(d) //读到分隔符,并返回给b
fmt.Println(buf.String()) //smieth
fmt.Println(string(b)) //你好e
}
复制代码
5、ReadString方法,和ReadBytes方法一样
//func (b *Buffer) ReadString(delim byte) (line string,err error)
func main(){
var d byte = 'e'
buf := bytes.NewBufferString("你好esmieth")
fmt.Println(buf.String()) //你好esmieth
b,_ := buf.ReadString(d) //读取到分隔符,并返回给b
fmt.Println(buf.String()) //smieth
fmt.Println(string(b)) //你好e
}
复制代码
五、读入缓冲器
ReadFrom方法,从一个实现io.Reader接口的r,把r的内容读到缓冲器里,n返回读的数量
//func (b *Buffer) ReadFrom(r io.Reader) (n int64,err error)
func main(){
file, _ := os.Open("text.txt")
buf := bytes.NewBufferString("bob ")
buf.ReadFrom(file)
fmt.Println(buf.String()) //bob hello world
}复制代码
六、从缓冲器取出
Next方法,返回前n个byte(slice),原缓冲器变小
//func (b *Buffer) Next(n int) []byte
func main(){
buf := bytes.NewBufferString("hello world")
fmt.Println(buf.String())
b := buf.Next(2) //取前2个
fmt.Println(buf.String()) //llo world
fmt.Println(string(b)) //he
}
复制代码
golang的bytes.buffer的更多相关文章
- Golang之bytes.buffer
bytes.buffer是一个缓冲byte类型的缓冲器存放着都是byte Buffer 是 bytes 包中的一个 type Buffer struct{-} A buffer is a variab ...
- Golang bytes.buffer详解
原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...
- golang bytes.Buffer Reset
func t() { a := []'} buf := new(bytes.Buffer) buf.Write(a) b := buf.Bytes() fmt.Println(b) buf.Reset ...
- Golang学习 - bytes 包
------------------------------------------------------------ 对于传入 []byte 的函数,都不会修改传入的参数,返回值要么是参数的副本, ...
- golang的bytes.NewReader函数出现的问题
在我试图装入一个300mb的数据时,发生了溢出. 我本以为不会出现这种问题的(内存和硬盘都够用),可见golang的bytes包还是设置了容量限制的. 虽然通常来说300mb的[]byte不管什么情况 ...
- Golang 使用Protocol Buffer 案例
目录 1. 前言 2. Protobuf 简介 2.1 Protobuf 优点 2.2 Protobuf 缺点 2.3 Protobuf Golang 安装使用 3. Protobuf 通讯案例 3. ...
- golang语言中bytes包的常用函数,Reader和Buffer的使用
bytes中常用函数的使用: package main; import ( "bytes" "fmt" "unicode" ) //byte ...
- [golang]内存不断增长bytes.makeSlice
------------------------------------------ 2015.7月更新 后面发现这里其实有一个sb的问题,在于内存回收和释放. 每个http请求,都会带一个http. ...
- 关于golang中IO相关的Buffer类浅析
io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } t ...
随机推荐
- day21 Pyhton学习 模块
一.模块:就是一个包含了python定义和声明的文件,文件名是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1.使用python编写的代码(.py文件) 2.已被编译为共 ...
- pytest使用小结
一.pytest简洁和好处 自动发现测试用例 testloader 断言方便 ,自定义错误提示 assert 正则匹配 灵活运行指定的测试用例,指定模块,制定测试类,测试用例 -k 标签化,回归 正向 ...
- 《Kafka笔记》3、Kafka高级API
目录 1 Kafka高级API特性 1.1 Offset的自动控制 1.1.1 消费者offset初始策略 1.1.2 消费者offset自动提交策略 1.2 Acks & Retries(应 ...
- spring-boot-route(二十二)实现邮件发送功能
在项目开发中,除了需要短信验证外,有时候为了节省 短信费也会使用邮件发送.在Spring项目中发送邮件需要封装复杂的消息体,不太方便.而在Spring Boot项目中发送邮件就太简单了,下面一起来看看 ...
- 最新版Python 3.8.6 版本发布
Python 3.8.6 发布了,它是 Python 3.8 的第六个维护版本. 3.8 系列的维护版本将每两个月定期更新一次,3.8.7 计划于 2020 年 11 月中旬发布. 随着维护版本的发布 ...
- rpc服务在游戏中的简单运用
我们最开始做的游戏框架,多数都是client->server->db的模式,但是随着玩家数量的增加,一个server进程就会扛不住,需要多个进程服务于多个玩家.但是给定了不同进程的玩家,有 ...
- IDEA Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.8.2-plugin爆红错误
如果确认本地库存在,maven仓库配置正确,将其显式声明出来,问题解决 <!--报找不到该依赖的错误, 本地库又存在,将其显式声明在这里,问题解决--> <plugin> &l ...
- openresty下安装luarocks
wget https://luarocks.org/releases/luarocks-2.4.1.tar.gz tar -xzvf luarocks-2.4.1.tar.gz cd luarocks ...
- C#/WPF 使用的Task线程程序缺依旧响应缓慢问题
问题:C#/WPF 使用的Task线程程序缺依旧响应缓慢问题 摘要:相信很多做WPF的开发者在请求接口的时候会去采用开一个线程Task去请求接口.避免UI卡主等等.但有一个问题是但开的线程比较多的情况 ...
- PPT神器
今天要给大家推荐一款开挂一般的 PPT 插件:iSlide 强烈推荐大家下载使用哈,绝对分分钟让你做出美观大气的 PPT! 不管是老师.学生还是公司人员,PPT 都是必须要掌握的技能,然而要 ...