Go中bytes.Buffer理解
生活随笔
收集整理的這篇文章主要介紹了
Go中bytes.Buffer理解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
buffer
前言
最近操作文件,進(jìn)行優(yōu)化使用到了buffer。好像也不太了解這個(gè),那么就梳理下,buffer的使用。
例子
我的場(chǎng)景:使用xml拼接了office2003的文檔。寫入到buffer,然后處理完了,轉(zhuǎn)存到文件里面。
type Buff struct {Buffer *bytes.BufferWriter *bufio.Writer }// 初始化 func NewBuff() *Buff {b := bytes.NewBuffer([]byte{})return &Buff{Buffer: b,Writer: bufio.NewWriter(b),} }func (b *Buff) WriteString(str string) error {_, err := b.Writer.WriteString(str)return err }func (b *Buff) SaveAS(name string) error {file, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666)if err != nil {return err}defer file.Close()if err := b.Writer.Flush(); err != nil {return nil}_, err = b.Buffer.WriteTo(file)return err }func main() {var b = NewBuff()b.WriteString("haah") }了解下bytes.buffer
bytes.buffer是一個(gè)緩沖byte類型的緩沖器,這個(gè)緩沖器里存放著都是byte。
如何創(chuàng)建bytes.buffer
放幾種創(chuàng)建的方式
buf1 := bytes.NewBufferString("hello")fmt.Println(buf1)buf2 := bytes.NewBuffer([]byte("hello"))fmt.Println(buf2)buf3 := bytes.NewBuffer([]byte{byte('h'), byte('e'), byte('l'), byte('l'), byte('o')})fmt.Println(buf3) // 以上三者等效buf4 := bytes.NewBufferString("")fmt.Println(buf4)buf5 := bytes.NewBuffer([]byte{})fmt.Println(buf5) // 以上兩者等效查看源碼可知
func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }func NewBufferString(s string) *Buffer {return &Buffer{buf: []byte(s)} }NewBufferString也是將參數(shù)轉(zhuǎn)成[]byte()。然后,初始化Buffer。
bytes.buffer的數(shù)據(jù)寫入
寫入string
buf := bytes.NewBuffer([]byte{})buf.WriteString("小花貓")fmt.Println(buf.String())寫入[]byte
buf := bytes.NewBuffer([]byte{})s := []byte("小黑貓")buf.Write(s)fmt.Println(buf.String())寫入byte
var b byte = '?'buf.WriteByte(b)fmt.Println(buf.String())寫入rune
var r rune = '小'buf.WriteRune(r)fmt.Println(buf.String())從文件寫入
file, err := os.Open("./buffer/test.txt") //test.txt的內(nèi)容是“world”if err != nil {fmt.Println(err)}defer file.Close()fmt.Println(file.Sync())buf := bytes.NewBufferString("hello ")buf.ReadFrom(file) //將text.txt內(nèi)容追加到緩沖器的尾部fmt.Println(buf.String()) //打印“hello world”數(shù)據(jù)寫出
寫出數(shù)據(jù)到io.Writer
file, _ := os.Open("text.txt")buf := bytes.NewBufferString("hello")buf.WriteTo(file) // hello寫到text.txt文件中了os.File就是實(shí)現(xiàn)io.Writer
Read
bufRead := bytes.NewBufferString("hello")fmt.Println(bufRead.String())var sRead = make([]byte, 3) // 定義讀出的[]byte為3,表示一次可讀出3個(gè)bytebufRead.Read(sRead) // 讀出fmt.Println(bufRead.String()) // 打印結(jié)果為lo,因?yàn)榍叭齻€(gè)被讀出了fmt.Println(string(sRead)) // 打印結(jié)果為hel,讀取的是hello的前三個(gè)字母bufRead.Read(sRead) // 接著讀,但是bufRead之剩下lo,所以只有l(wèi)o被讀出了fmt.Println(bufRead.String()) // 打印結(jié)果為空fmt.Println(string(sRead)) // 打印結(jié)果lol,前兩位的lo表示的本次的讀出,因?yàn)閎ufRead只有兩位,后面的l還是上次的讀出結(jié)果 ReadBytebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內(nèi)容轉(zhuǎn)成string,>以便于打印b, _ := buf.ReadByte() // 讀取第一個(gè)byte,賦值給bfmt.Println(buf.String()) // 打印 ello,緩沖器頭部第一個(gè)h被拿掉fmt.Println(string(b)) // 打印 h ReadRunebuf := bytes.NewBufferString("好hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內(nèi)容轉(zhuǎn)成string,>以便于打印b, n, _ := buf.ReadRune() // 讀取第一個(gè)rune,賦值給bfmt.Println(buf.String()) // 打印 hellofmt.Println(string(b)) // 打印中文字: 好,緩沖器頭部第一個(gè)“好”被拿掉fmt.Println(n) // 打印3,“好”作為utf8儲(chǔ)存占3個(gè)byteb, n, _ = buf.ReadRune() // 再讀取第一個(gè)rune,賦值給bfmt.Println(buf.String()) // 打印 ellofmt.Println(string(b)) // 打印h,緩沖器頭部第一個(gè)h被拿掉fmt.Println(n) // 打印 1,“h”作為utf8儲(chǔ)存占1個(gè)byteReadBytes
ReadBytes和ReadByte是有區(qū)別的。ReadBytes需要一個(gè)分隔符來對(duì)buffer進(jìn)行分割讀取。
var d byte = 'e' //分隔符為ebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內(nèi)容轉(zhuǎn)成string,以便于打印b, _ := buf.ReadBytes(d) // 讀到分隔符,并返回給bfmt.Println(buf.String()) // 打印 llo,緩沖器被取走一些數(shù)據(jù)fmt.Println(string(b)) // 打印 he,找到e了,將緩沖器從頭開始,到e的內(nèi)容都返回給bReadString
ReadString和ReadBytes一樣,也是需要一個(gè)分隔符進(jìn)行,buffer
var d byte = 'e' //分隔符為ebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內(nèi)容轉(zhuǎn)成string,以便于打印b, _ := buf.ReadString(d) // 讀到分隔符,并返回給bfmt.Println(buf.String()) // 打印 llo,緩沖器被取走一些數(shù)據(jù)fmt.Println(b) // 打印 he,找到e了,將緩沖器從頭開始,到e的內(nèi)容都返回給bNext
使用Next可依次讀出固定長度的內(nèi)容
buf := bytes.NewBufferString("hello")fmt.Println(buf.String())b := buf.Next(2) // 重頭開始,取2個(gè)fmt.Println(buf.String()) // 變小了fmt.Println(string(b)) // 打印he總結(jié)
以上是生活随笔為你收集整理的Go中bytes.Buffer理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang的time包:秒、毫秒、纳秒
- 下一篇: Go 语言的%d,%p,%v等占位符的使