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