Go语言基础语法 Buffer | 青训营

104 阅读3分钟

1.什么是BUffer

在Go语言中,Buffer是一种临时存储区域,用于在两个不同的处理速度之间进行数据传输。它可以用来解决不同设备之间传输数据速度不匹配的问题。

在计算机中,Buffer常常用于存储输入/输出数据,以平衡输入和输出设备之间的速度差异。当数据从一个设备传输到另一个设备时,Buffer可以暂时存储数据,以便接收设备可以按照自己的速度进行处理。

Buffer还可以用于网络通信中,用于存储网络数据包。当发送方的发送速度快于接收方的处理速度时,Buffer可以临时存储数据包,以便接收方可以按照自己的速度进行处理。

此外,Buffer还可以用于缓存数据,以提高数据读取和写入的效率。将数据存储在Buffer中,可以减少对底层存储设备的频繁访问,从而提高数据处理的速度。

2.创建缓冲区

在Go中,可以使用bytes包创建缓冲区,具体来说是Buffer类型。以下是创建和使用缓冲区的示例:

package main

import (
    "bytes"
    "fmt"
)

 //使用 NewBuffer 函数创建
func main() {
    buf := bytes.NewBufferString("hello world")
    fmt.Println(buf.String()) // 输出:hello world
   }
   
    //使用 bytes.Buffer 结构体创建
func main() {
    var buf bytes.Buffer
    buf.WriteString("hello")
    buf.WriteString(" ")
    buf.WriteString("world")
    fmt.Println(buf.String()) // 输出:hello world
}

3.向缓冲区写入数据

创建好缓冲区之后,我们可以向其中写入数据。Buffer类型提供了多种方法来写入数据,其中最常用的是Write方法。

//p 参数是要写入缓冲区的字节切片,返回值 n 表示实际写入的字节数
func (b *Buffer) Write(p []byte) (n int, err error)

除了 Write 方法之外,Buffer 类型还提供了一系列其他方法来写入数据,例如 WriteString、WriteByte、WriteRune 等。这些方法分别用于向缓冲区写入字符串、单个字节、单个 Unicode 字符等。

下面是一个使用 Write 方法向缓冲区写入数据的示例:

import (
    "bytes"
    "fmt"
)

func main() {
    buf := bytes.NewBuffer(nil)
    n, err := buf.Write([]byte("hello world"))
    if err != nil {
        fmt.Println("write error:", err)
    }
    fmt.Printf("write %d bytes\n", n) // 输出:write 11 bytes
    fmt.Println(buf.String()) // 输出:hello world
}

4.从缓冲区读取数据

Buffer 类型提供了多种方法来读取数据,其中最常用的是 Read 方法。

//p 参数是用于存放读取数据的字节切片,返回值 n 表示实际读取的字节数
func (b *Buffer) Read(p []byte) (n int, err error)

除了 Read 方法之外,Buffer 类型还提供了一系列其他方法来读取数据,例如 ReadString、ReadByte、ReadRune 等。这些方法分别用于从缓冲区读取字符串、单个字节、单个 Unicode 字符等。

下面是一个使用 Read 方法从缓冲区读取数据的示例:

import (
    "bytes"
    "fmt"
)

func main() {
    buf := bytes.NewBufferString("hello world")
    data := make([]byte, 5)
    n, err := buf.Read(data)
    if err != nil {
        fmt.Println("read error:", err)
    }
    fmt.Printf("read %d bytes\n", n) // 输出:read 5 bytes
    fmt.Println(string(data)) // 输出:hello
}