net.Conn转换函数应保留原始数据分段吗?

时间:2017-11-17 17:29:35

标签: go

为了澄清,net.Conn transform()函数转换数据写入/读取连接,示例如下:

type TransformedConn struct {
  net.Conn
}

func (c *TransformedConn) Read(p []byte) (int, error) {
  n, err := c.Conn.Read(p)
  transform(p)
  return n, err
}

func (c *TransformedConn) Write(p []byte) (int, error) {
  t := append([]byte{}, p...) // as `p` must not be modified per io.Writer doc
  transform(t)
  return c.Conn.Write(t)
}

同样,crypto/cipher.StreamReadercrypto/cipher.StreamWriter执行类似的操作。

根据io.Writer.Write()的要求,它无法修改输入缓冲区。如果缓冲区的大小很大,创建相同大小的缓冲区将非常昂贵。所以我想知道这样的转换函数是否可以在较小的块中写出数据,以便我们使用更小的空间?

我发现这种分块技术会导致某些程序失败,尤其是使用io.ReadFull()io.ReadAtLeast()的程序。因为他们隐含地希望到达的数据来自单个read()电话。

有人能指出一个关于如何编写这种转换函数的文档或规范吗?

谢谢!

0 个答案:

没有答案