天天看點

go bytes包詳解

一:建立緩沖器

bytes.buffer是一個緩沖byte類型的緩沖器

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

2、bytes.NewBufferString建立

3、bytes.Buffer{} 

代碼示範 

package main

import (
  "bytes"
  "fmt"
)
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)
}      

二:寫入到緩沖器

package main
import (
  "bytes"
  "fmt"
)
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
}      
package main
import (
  "bytes"
  "fmt"
)
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類型的資料放到緩沖器的尾部

package main

import (
  "bytes"
  "fmt"
)

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類型的資料放到緩沖器的尾部

package main

import (
  "bytes"
  "fmt"
)
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

package main
import (
  "bytes"
  "os"
)
func main() {
  file,_ := os.Create("text.txt")
  buf := bytes.NewBufferString("hello world")
  buf.WriteTo(file)
}      

四、讀出緩沖器

package main
import (
  "bytes"
  "fmt"
)
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 "
}      
package main
import (
  "bytes"
  "fmt"
)
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
}      
package main
import (
  "bytes"
  "fmt"
)
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
}      

五、讀入緩沖器

package main
import (
  "bytes"
  "fmt"
  "os"
)
func main() {
  file, _ := os.Open("text.txt")
  buf := bytes.NewBufferString(" ")
  buf.ReadFrom(file)
  fmt.Println(buf.String()) //bob hello world
}      

六、從緩沖器取出

package main

import (
  "bytes"
  "fmt"
)
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
}