参考原文: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. 你想了解的《javaScript语言精粹》(三)

    # javaScript语言精粹  # 第三章 对象 - javaScript 数据类型     1. 基础数据类型         Number String Boolean Undefined N ...

  2. 多路查找树(2-3 树、2-3-4 树、B 树、B+ 树)

    本文参考自<大话数据结构> 计算机中数据的存储 一般而言,我们都是在内存中处理数据,但假如我们要操作的数据集非常大,内存无法处理了,在这种情况下对数据的处理需要不断地从硬盘等存储设备中调入 ...

  3. spring boot:实现图片文件上传并生成缩略图(spring boot 2.3.1)

    一,为什么要给图片生成缩略图? 1, 用户上传的原始图片如果太大,不能直接展示在网站页面上, 因为不但流费server的流量,而且用户打开时非常费时间, 所以要生成缩略图. 2,服务端管理图片要注意的 ...

  4. C++实现求离散数学命题公式的真值表

    一.实验内容 (1)求任意一个命题公式的真值表. (2)利用真值表求任意一个命题公式的主范式. (3)利用真值表进行逻辑推理. 注:(2)和(3)可在(1)的基础上完成. 二.实验目的 真值表是命题逻 ...

  5. Redis 入门与 ASP.NET Core 缓存

    目录 基础 Redis 库 连接 Redis 能用 redis 干啥 Redis 数据库存储 字符串 订阅发布 RedisValue ASP.NET Core 缓存与分布式缓存 内存中的缓存 ASP. ...

  6. ubuntu 16.04 Chrome

    打开终端 输入 命令1:sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list ...

  7. c#用于时间日期的类型:DateTime

    https://blog.csdn.net/qq_42675313/article/details/82155446 写的简洁易懂了

  8. Hibernate注解实体类

    Hibernate注解1.@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2.@Table(name="",cat ...

  9. 重新开始记录java教程

    最近在工作上学到了很多的知识和经验,以后每天都来记录给博客园上面

  10. python 作业 用python实现 mysql查询结果导出带列名

    1 import pandas as pd 2 import numpy as np 3 import matplotlib as mpl 4 import matplotlib.pyplot as ...