如何确定golang中连接的确切字节长度?

How to determine the exact byte length of connection in golang?

我有以下代码:

var buf []byte
read_len, err := conn.Read(buf)
if err != nil {
    fmt.Println("Error reading:", err.Error())
}
buffer := make([]byte, read_len)
_, err = conn.Read(buffer)
if err != nil {
    fmt.Println("Error reading:", err.Error())
}

目的是用第一个 buf 确定 read_len,然后创建第二个 buffer,这是传入 json 请求的确切长度。这只会导致错误

unexpected end of JSON input

当我尝试解组时

var request Device_Type_Request_Struct
err = json.Unmarshal(buffer, &request)

我假设发生此错误是因为 conn.Read(buffer) 没有返回任何内容,因为另一个缓冲区已经读取了它(虽然不确定)。我应该如何确定 json 请求的长度,同时又能将其读入缓冲区(长度完全相同)?

Read returns 读取到缓冲区的字节数。因为传递给第一次调用 conn.Read 的缓冲区长度为零,所以第一次调用 conn.Read 总是 returns 零。

如果不读取数据,就无法确定对等点发送了多少数据。

解决此问题的简单方法是使用 JSON decoder:

d := json.NewDecoder(conn)
var request Device_Type_Request_Struct
if err := d.Decode(&request); err != nil {
    // handle error
}

解码器从流中读取和解码 JSON 个值。