类似 []byte的切片十分常见,Go语言有一个bytes包专门解决这种类型的操作方法。
bytes包和字符串包十分类似。而且它还包含一个十分有用的类型Buffer,这是一个长度可变的bytes的buffer,提供Read和Write方法,因为读写长度未知的bytes最好使用buffer。

1.1 Buffer定义

第一种定义方法

  1. var buffer bytes.Buffer

第二种:

  1. var r *bytes.Buffer = new(bytes.Buffer)

示例:

  1. func main() {
  2. buffer1()
  3. fmt.Println("----------------")
  4. buffer2()
  5. }
  6. func buffer1() {
  7. var buffer bytes.Buffer
  8. buffer.WriteString("你好")
  9. buffer.WriteString(",Ada!")
  10. fmt.Println(buffer.String())
  11. }
  12. func buffer2() {
  13. var r = new(bytes.Buffer) //返回类型是*bytes.Buffer
  14. fmt.Println("类型是:", reflect.TypeOf(r))
  15. r.WriteString("你好")
  16. r.WriteString(",Leon!")
  17. fmt.Println(r.String())
  18. }
  19. /*
  20. 你好,Ada!
  21. ----------------
  22. 类型是: *bytes.Buffer
  23. 你好,Leon!
  24. */

除此之外,通过函数NewBuffer(buf []byte) Buffer,或者NewBuffString(s string)创建 Buffer对象,也可以实现

  1. func main() {
  2. buffer3()
  3. }
  4. func buffer3() {
  5. a := bytes.NewBufferString("你好")
  6. a.WriteString(",艾斯利")
  7. fmt.Println(a.String())
  8. var arr []byte
  9. b := bytes.NewBuffer(arr)
  10. b.WriteString("hello")
  11. b.WriteString(",world")
  12. fmt.Println(b.String())
  13. }
  14. /*
  15. 你好,艾斯利
  16. hello,world
  17. */

用上述方法比+=更节省内存和CPU,尤其是要串联的字符串数目特别多的时候。