文档章节

go语言的bytes.buffer

waynehu
 waynehu
发布于 2013/05/06 18:20
字数 1850
阅读 13732
收藏 11
点赞 6
评论 1

##bytes.buffer是 bytes.buffer是一个缓冲byte类型的缓冲器,这个缓冲器里存放着都是byte

##创建一个缓冲器 ###NewBuffer
如果在使用bytes.NewBuffer的时候,参数是[]byte的slice的话
缓冲器里就是这个slice的内容,如果参数是nil的话,意思是New一个空的缓冲器里
###NewBufferString
还可以用bytes.NewBufferString("hello")来建立一个内容是hello的缓冲器

buf1:=bytes.NewBufferString("hello")
buf2:=bytes.NewBuffer([]byte("hello"))
buf3:=bytes.NewBuffer([]byte{"h","e","l","l","o"})
以上三者等效
buf4:=bytes.NewBufferString("")
buf5:=bytes.NewBuffer([]byte{})
以上两者等效

如果buffer在new的时候是空的也没关系,因为可以用Write来写入,写在尾部

##写入到缓冲器(缓冲器变大) ###Write---- func (b *Buffer) Write(p []byte) (n int, err error) 使用Write方法,将一个byte类型的slice放到缓冲器的尾部

package main

import (
    "bytes"
    "fmt"
)

func main() {
    s := []byte(" world")
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String())  //buf.String()方法是吧buf里的内容转成string,以便于打印
    buf.Write(s) //将s这个slice写到buf的尾部
    fmt.Println(buf.String())  //打印 hello world
}

###WriteString---- func (b *Buffer) WriteString(s string) (n int, err error) 使用WriteString方法,将一个字符串放到缓冲器的尾部

package main

import (
    "bytes"
    "fmt"
)

func main() {
    s := " world"
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String())  //buf.String()方法是吧buf里的内容转成string,以便于打印
    buf.WriteString(s) //将s这个string写到buf的尾部
    fmt.Println(buf.String())  //打印 hello world
}

###WriteByte---- func (b *Buffer) WriteByte(c byte) error 使用WriteByte方法,将一个byte类型的数据放到缓冲器的尾部

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var s byte = '!'
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String())  //buf.String()方法是吧buf里的内容转成string,以便于打印
    buf.WriteByte(s) //将s这个string写到buf的尾部
    fmt.Println(buf.String())  //打印 hello!
}

###WriteRune---- func (b *Buffer) WriteRune(r rune) (n int, err error) 使用WriteRune方法,将一个rune类型的数据放到缓冲器的尾部

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var s rune = '好'
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String())  //buf.String()方法是吧buf里的内容转成string,以便于打印
    buf.WriteRune(s) //将s这个string写到buf的尾部
    fmt.Println(buf.String())  //打印 hello好
}

##从缓冲器写出(缓冲器变小) ###WriteTo---- func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) 使用WriteTo方法,将一个缓冲器的数据写到w里,w是实现io.Writer的,比如os.File就是实现io.Writer

package main

import (
    "bytes"
    "fmt"
    "os"
)

func main() {
    file , _ := os.Create("text.txt")
    buf := bytes.NewBufferString("hello")
    buf.WriteTo(file) //hello写到text.txt文件中了
    fmt.Fprintf(file, buf.String()) //虽然这不在讨论范围,但这句效果同上
}

##读出缓冲器(缓冲器变小) ###Read----func (b *Buffer) Read(p []byte) (n int, err error) 给Read方法一个容器p,读完后,p就满了,缓冲器相应的减少了,返回的n为成功读的数量
如,缓冲器是一个装满5升水的杯子,这个杯子有Read方法,给Read方法一个3升的杯子
Read完后,5升杯子里有2升水,3升的杯子满了,返回的n为3 在一次Read时,5升杯子里有0升水,3升的杯子还是满的,但其中有2升的水被新倒入的水替代了,返回的n为2

package main
import(
    "fmt"
    "bytes"
)

func main() {
    s1:=[]byte("hello")                //申明一个slice为s1
    buff:=bytes.NewBuffer(s1)     //new一个缓冲器buff,里面存着hello这5个byte
    s2:=[]byte(" world")                 //申明另一个slice为s2
    buff.Write(s2)                     //把s2写入添加到buff缓冲器内
    fmt.Println(buff.String())            //使用缓冲器的String方法转成字符串,并打印:"hello world"
    
    s3:=make([]byte,3)               //申明一个空的slice为s3,容量为3
    buff.Read(s3)                       //把buff的内容读入到s3内,因为s3的容量为3,所以只读了3个过来
    fmt.Println(buff.String())       //buff的前3个字符被读走了,所以buff变成:"lo world"
    fmt.Println(string(s3))          //空的s3被写入3个字符,所以为"hel"
    buff.Read(s3)                       //把buff的内容读入到s3内,因为s3的容量为3,所以只读了3个过来,原来s3的内容被覆盖了
    fmt.Println(buff.String())       //buff的前3个字符又被读走了,所以buff变成:"world"
    fmt.Println(string(s3))          //原来的s3被从"hel"变成"lo ",因为"hel"被覆盖了
}

###ReadByte---- func (b *Buffer) ReadByte() (c byte, err error) 返回缓冲器头部的第一个byte,缓冲器头部第一个byte被拿掉

package main

import (
    "bytes"
    "fmt"
)

func main() {
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String()) //buf.String()方法是吧buf里的内容转成string,>以便于打印
    b, _ := buf.ReadByte()    //读取第一个byte,赋值给b
    fmt.Println(buf.String()) //打印 ello,缓冲器头部第一个h被拿掉
    fmt.Println(string(b))    //打印 h
}

###ReadRune---- func (b *Buffer) ReadRune() (r rune, size int, err error) ReadRune和ReadByte很像 返回缓冲器头部的第一个rune,缓冲器头部第一个rune被拿掉

package main

import (
    "bytes"
    "fmt"
)

func main() {
    buf := bytes.NewBufferString("好hello")
    fmt.Println(buf.String()) //buf.String()方法是吧buf里的内容转成string,>以便于打印
    b, n, _ := buf.ReadRune() //读取第一个rune,赋值给b
    fmt.Println(buf.String()) //打印 hello
    fmt.Println(string(b))    //打印中文字: 好,缓冲器头部第一个“好”被拿掉
    fmt.Println(n)            //打印3,“好”作为utf8储存占3个byte
    b, n, _ = buf.ReadRune()  //再读取第一个rune,赋值给b
    fmt.Println(buf.String()) //打印 ello
    fmt.Println(string(b))    //打印h,缓冲器头部第一个h被拿掉
    fmt.Println(n)            //打印 1,“h”作为utf8储存占1个byte
}

###ReadBytes---- func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) ReadBytes和ReadByte根本就不是一回事,MD
ReadBytes需要一个byte作为分隔符,读的时候从缓冲器里找第一个出现的分隔符(delim),找到后,把从缓冲器头部开始到分隔符之间的所有byte进行返回,作为byte类型的slice,返回后,缓冲器也会空掉一部分

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var d byte = 'e' //分隔符为e
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String()) //buf.String()方法是吧buf里的内容转成string,以便于打印
    b, _ := buf.ReadBytes(d)  //读到分隔符,并返回给b
    fmt.Println(buf.String()) //打印 llo,缓冲器被取走一些数据
    fmt.Println(string(b))    //打印 he,找到e了,将缓冲器从头开始,到e的内容都返回给b
}

###ReadString---- func (b *Buffer) ReadString(delim byte) (line string, err error) ReadBytes和ReadString基本就是一回事
ReadBytes需要一个byte作为分隔符,读的时候从缓冲器里找第一个出现的分隔符(delim),找到后,把从缓冲器头部开始到分隔符之间的所有byte进行返回,作为字符串,返回后,缓冲器也会空掉一部分

package main

import (
    "bytes"
    "fmt"
)

func main() {
    var d byte = 'e' //分隔符为e
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String()) //buf.String()方法是吧buf里的内容转成string,以便于打印
    b, _ := buf.ReadString(d)  //读到分隔符,并返回给b
    fmt.Println(buf.String()) //打印 llo,缓冲器被取走一些数据
    fmt.Println(b)    //打印 he,找到e了,将缓冲器从头开始,到e的内容都返回给b
}

##读入缓冲器(缓冲器变大) ###ReadFrom---- func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) 从一个实现io.Reader接口的r,把r里的内容读到缓冲器里,n返回读的数量

package main

import (
    "bytes"
    "fmt"
    "os"
)

func main() {
    file, _ := os.Open("test.txt")  //test.txt的内容是“world”
    buf := bytes.NewBufferString("hello ")
    buf.ReadFrom(file)              //将text.txt内容追加到缓冲器的尾部
    fmt.Println(buf.String())    //打印“hello world”
}

##从缓冲器取出(缓冲器变小) ###Next ---- func (b *Buffer) Next(n int) []byte 返回前n个byte,成为slice返回,原缓冲器变小

package main

import (
    "bytes"
    "fmt"
)

func main() {
    buf := bytes.NewBufferString("hello")
    fmt.Println(buf.String())
    b := buf.Next(2)   //重头开始,取2个
    fmt.Println(buf.String())  //变小了
    fmt.Println(string(b))   //打印he
}

##其他未提及 ###以后再写 Len
Grow
Reset
Truncate
UnreadRune
UnreadByte

© 著作权归作者所有

共有 人打赏支持
waynehu
粉丝 33
博文 51
码字总数 25481
作品 0
静安
加载中

评论(1)

ckex
ckex
79
Go接口——接口值

Go接口——接口值 1.接口值 Under the covers, interfaces are implemented as two elements, a type and a value.The value, called the interface's dynamic value, is an arbitrary conc......

秋风醉了
2016/07/12
59
0
GO语言手动处理TCP粘包

应用场景 大部分TCP通讯场景下,使用自定义通讯协议 image.png 粘包处理原理:通过请求头中数据包大小,将客户端N次发送的数据缓冲到一个数据包中 例如: 请求头占3个字节(指令头1字节、数据...

怪咖_OOP
2017/12/10
0
0
golang中结构体的初始化方法(new方法)

自定义一个结构体 type Rect struct { x, y float64 width, height float64 } 初始化方法: rect1 := new(Rect) rect2 := &Rect{} rect3 := &Rect{0, 0, 100, 200} rect4 := &Rect{width:10......

徐学良
2015/10/14
80
0
Golang FlameGraph(火焰图)

简介 初学golang(一个月多),之前主要用其他语言,如有问题欢迎指出。 安装 代码修改 使用 查看 使用浏览器查看svg文件,程序运行中,可以登录 查看程序实时状态 在此基础上,可以通过配置...

城寒
2017/11/01
0
5
Go圣经-学习笔记之基础数据类型

上一篇 Go圣经-学习笔记之程序结构(二) 下一篇 Go圣经-临时插入ORM的小trick 前言 Go语言的数据类型分为四类:、、和。其中 基础类型,包括:, 、 , , 等 复合类型,包括:、。它们由一个或者...

cdh0805010
2017/10/22
0
0
golang -- 网络字节编解码(2)

以下是利用标准库binary来进行编解码 解码 ①使用bytes.NewReader/bytes.Buffer来存储要解码的ascii串 ②使用binary.Read来解码 package main import ( "bytes" "encoding/binary" "fmt") f...

flyking
2014/01/10
0
0
go 性能相关总结

性能测试基本概念 基本概念 Benchmark: 性能测试 ns/op: 纳秒/每个操作,前面数值越小越快 命令 go test -c go test -test.bench=. -test.cpuprofile=cpu.prof go tool pprof bench.test cp...

solate
2016/11/24
28
0
go语言调用google的语音识别api

今天写了一个调用google语音识别api的接口,具体的参数请参考http://blog.csdn.net/dlangu0393/article/details/7214728 下面是我写的go语言代码 package main import ( "io" "os" "fmt" "b...

zongjh
2013/12/02
0
0
Golang实现简单tcp服务器04 -- 服务器的粘包处理

什么是粘包 一个完成的消息可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题 TCP粘包和拆包产生的原因 应用程序写入数据的字节...

victoriest
2015/06/02
0
0
GO性能优化小结

1 内存优化 1.1 小对象合并成结构体一次分配,减少内存分配次数 做过C/C++的同学可能知道,小对象在堆上频繁地申请释放,会造成内存碎片(有的叫空洞),导致分配大的对象时无法申请到连续的...

John
01/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
4分钟前
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
15分钟前
0
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
25分钟前
0
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
34分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
43分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
43分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
45分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型 上一篇:JVM学习笔记一:类加载机制介绍...

刘祖鹏
50分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
54分钟前
0
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部