使用套接字时重用读取缓冲区

Gon*_*lez 3 sockets buffer go

我想知道在 go 中重用 []byte 缓冲区的正确方法。我这样声明

buf := make([]byte, 1024)
Run Code Online (Sandbox Code Playgroud)

然后像这样使用

conn, _ := net.Dial("tcp", addr)
_, err = conn.read(buf)
Run Code Online (Sandbox Code Playgroud)

我听说声明一个新的缓冲区效率不高,因为它涉及内存分配,我们应该重用现有的缓冲区。但是我不确定我是否可以再次传递缓冲区并且它将被擦除,或者它可以保存之前消息的部分内容(特别是如果来自套接字的当前消息比上一条消息短)?

Cer*_*món 5

Read 方法最多读取 len(buf) 个字节到缓冲区并返回读取的字节数。

Read 方法不会修改调用者切片的长度。它不能,因为切片是按值传递的。应用程序必须使用返回的长度来获取实际读取的字节片段。

n, err = conn.Read(buf)
bufRead := buf[:n]
Run Code Online (Sandbox Code Playgroud)

应用程序可以使用同一缓冲区多次调用 Read。

conn, err := net.Dial("tcp", addr)
if err != nil {
    // handle error
}

buf := make([]byte, 1024)
for {
    n, err = conn.Read(buf)
    if err != nil {
        // handle error
    }
    fmt.Printf("Read %s\n", buf[:n]) // buf[:n] is slice of bytes read from conn
}
Run Code Online (Sandbox Code Playgroud)