golang的bytes.buffer

Jsp發表於2018-11-24

參考原文:go語言的bytes.buffer 

一、建立緩衝期

bytes.buffer是一個緩衝byte型別的緩衝器

1、使用bytes.NewBuffer建立:引數是[]byte的話,緩衝器裡就是這個slice的內容;如果引數是nil的話,就是建立一個空的緩衝器。

2、bytes.NewBufferString建立

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
}
複製程式碼


相關文章