日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go中bytes.Buffer理解

發布時間:2024/9/30 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go中bytes.Buffer理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

buffer

前言

最近操作文件,進行優化使用到了buffer。好像也不太了解這個,那么就梳理下,buffer的使用。

例子

我的場景:使用xml拼接了office2003的文檔。寫入到buffer,然后處理完了,轉存到文件里面。

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是一個緩沖byte類型的緩沖器,這個緩沖器里存放著都是byte。

如何創建bytes.buffer

放幾種創建的方式

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也是將參數轉成[]byte()。然后,初始化Buffer。

bytes.buffer的數據寫入

寫入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的內容是“world”if err != nil {fmt.Println(err)}defer file.Close()fmt.Println(file.Sync())buf := bytes.NewBufferString("hello ")buf.ReadFrom(file) //將text.txt內容追加到緩沖器的尾部fmt.Println(buf.String()) //打印“hello world”

數據寫出

寫出數據到io.Writer

file, _ := os.Open("text.txt")buf := bytes.NewBufferString("hello")buf.WriteTo(file) // hello寫到text.txt文件中了

os.File就是實現io.Writer

Read

bufRead := bytes.NewBufferString("hello")fmt.Println(bufRead.String())var sRead = make([]byte, 3) // 定義讀出的[]byte為3,表示一次可讀出3個bytebufRead.Read(sRead) // 讀出fmt.Println(bufRead.String()) // 打印結果為lo,因為前三個被讀出了fmt.Println(string(sRead)) // 打印結果為hel,讀取的是hello的前三個字母bufRead.Read(sRead) // 接著讀,但是bufRead之剩下lo,所以只有lo被讀出了fmt.Println(bufRead.String()) // 打印結果為空fmt.Println(string(sRead)) // 打印結果lol,前兩位的lo表示的本次的讀出,因為bufRead只有兩位,后面的l還是上次的讀出結果 ReadBytebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內容轉成string,>以便于打印b, _ := buf.ReadByte() // 讀取第一個byte,賦值給bfmt.Println(buf.String()) // 打印 ello,緩沖器頭部第一個h被拿掉fmt.Println(string(b)) // 打印 h ReadRunebuf := bytes.NewBufferString("好hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內容轉成string,>以便于打印b, n, _ := buf.ReadRune() // 讀取第一個rune,賦值給bfmt.Println(buf.String()) // 打印 hellofmt.Println(string(b)) // 打印中文字: 好,緩沖器頭部第一個“好”被拿掉fmt.Println(n) // 打印3,“好”作為utf8儲存占3個byteb, n, _ = buf.ReadRune() // 再讀取第一個rune,賦值給bfmt.Println(buf.String()) // 打印 ellofmt.Println(string(b)) // 打印h,緩沖器頭部第一個h被拿掉fmt.Println(n) // 打印 1,“h”作為utf8儲存占1個byte

ReadBytes

ReadBytes和ReadByte是有區別的。ReadBytes需要一個分隔符來對buffer進行分割讀取。

var d byte = 'e' //分隔符為ebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內容轉成string,以便于打印b, _ := buf.ReadBytes(d) // 讀到分隔符,并返回給bfmt.Println(buf.String()) // 打印 llo,緩沖器被取走一些數據fmt.Println(string(b)) // 打印 he,找到e了,將緩沖器從頭開始,到e的內容都返回給b

ReadString

ReadString和ReadBytes一樣,也是需要一個分隔符進行,buffer

var d byte = 'e' //分隔符為ebuf := bytes.NewBufferString("hello")fmt.Println(buf.String()) // buf.String()方法是吧buf里的內容轉成string,以便于打印b, _ := buf.ReadString(d) // 讀到分隔符,并返回給bfmt.Println(buf.String()) // 打印 llo,緩沖器被取走一些數據fmt.Println(b) // 打印 he,找到e了,將緩沖器從頭開始,到e的內容都返回給b

Next

使用Next可依次讀出固定長度的內容

buf := bytes.NewBufferString("hello")fmt.Println(buf.String())b := buf.Next(2) // 重頭開始,取2個fmt.Println(buf.String()) // 變小了fmt.Println(string(b)) // 打印he

總結

以上是生活随笔為你收集整理的Go中bytes.Buffer理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。