参考原文: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的更多相关文章

  1. Golang之bytes.buffer

    bytes.buffer是一个缓冲byte类型的缓冲器存放着都是byte Buffer 是 bytes 包中的一个 type Buffer struct{-} A buffer is a variab ...

  2. Golang bytes.buffer详解

    原文:https://www.jianshu.com/p/e53083132a25 Buffer 介绍 Buffer 是 bytes 包中的一个 type Buffer struct{…} A buf ...

  3. golang bytes.Buffer Reset

    func t() { a := []'} buf := new(bytes.Buffer) buf.Write(a) b := buf.Bytes() fmt.Println(b) buf.Reset ...

  4. Golang学习 - bytes 包

    ------------------------------------------------------------ 对于传入 []byte 的函数,都不会修改传入的参数,返回值要么是参数的副本, ...

  5. golang的bytes.NewReader函数出现的问题

    在我试图装入一个300mb的数据时,发生了溢出. 我本以为不会出现这种问题的(内存和硬盘都够用),可见golang的bytes包还是设置了容量限制的. 虽然通常来说300mb的[]byte不管什么情况 ...

  6. Golang 使用Protocol Buffer 案例

    目录 1. 前言 2. Protobuf 简介 2.1 Protobuf 优点 2.2 Protobuf 缺点 2.3 Protobuf Golang 安装使用 3. Protobuf 通讯案例 3. ...

  7. golang语言中bytes包的常用函数,Reader和Buffer的使用

    bytes中常用函数的使用: package main; import ( "bytes" "fmt" "unicode" ) //byte ...

  8. [golang]内存不断增长bytes.makeSlice

    ------------------------------------------ 2015.7月更新 后面发现这里其实有一个sb的问题,在于内存回收和释放. 每个http请求,都会带一个http. ...

  9. 关于golang中IO相关的Buffer类浅析

    io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } t ...

随机推荐

  1. MeteoInfoLab脚本示例:TOMS HDF数据

    TOMS (Total Ozone Mapping Spectrometer)数据是全球臭氧观测.脚本程序: #Add data file folder = 'D:/Temp/hdf/' fns = ...

  2. 扫描仪扫描文件处理-Photoshop批处理无响应问题

    问题描述:Photoshop批处理时候卡死.卡住.无响应问题(出现在处理60M及以上TIFF文件的时候) 解决办法: 调整系统虚拟内存见<扫描-Photoshop批处理内存不足问题解决> ...

  3. 【CF1428D】Bouncing Boomerangs 题解

    原题链接 题意简介 毒瘤大模拟 给你一张n*n的图,在图上摆有一些物体.从每一列的底端往上扔回旋镖,每镖中一个东西,回旋镖就会向右转九十度.现在我们知道从每列i底端往上镖时撞上的物体个数ai,试构造出 ...

  4. php超全局数组 为什么swoole的http服务不能用

    php的超全局数组$_GET等九个 可以直接使用 无需定义 实际上是浏览器请求到Apache或者nginx的时候 转发到PHP处理模块 fpm转发给php解释器处理 php封装好后丢给php的  sw ...

  5. centos8平台:用fontconfig安装及管理字体(fc-list/fc-match/fc-cache)

    一,fc-list所属的rpm包 [root@blog ~]$ whereis fc-list fc-list: /usr/bin/fc-list /usr/share/man/man1/fc-lis ...

  6. matplotlib 饼状图

    import matplotlib.pyplot as plt import matplotlib as mpl # 支持中文 plt.rcParams['font.sans-serif'] = [' ...

  7. 超简单集成HMS ML Kit文字超分能力,一键提升文本分辨率

    前言 大家有没有遇到过这种情况,在浏览微博或者公众号时看到一段有趣的文字,于是截图发到朋友圈想和好友分享.但是在发布图片时,软件会对图片强制进行压缩,导致图片分辨率下降,文字变得模糊难以阅读.那么有没 ...

  8. Linux系统安装Redis(2020最新最详细)

    2020最新Linux系统发行版ContOS7演示安装Redis 为防止操作权限不足,建议切换root用户,当然如果你对Linux命令熟悉,能够自主完成权限更新操作,可以不考虑此推荐. 更多命令学习推 ...

  9. 微信小程序学习心得

    我们写小程序时都要跳转页面的,也会有底部导航来进行切换 这个时候就要介绍下窗口是怎样配置的 要在app.json文件里写一个tabBer对象 里面在定义一个list数组里面放我们定义的几个需要切换的页 ...

  10. 两个有序数列找第k小

    给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,例如对于数组x,x = {3,2,1,4,5,6},则其第2个最小的数为2  两个有序数组 找第k小 * 方案一 合并遍历 * 二:游 ...