为了澄清,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.StreamReader
和crypto/cipher.StreamWriter
执行类似的操作。
根据io.Writer.Write()
的要求,它无法修改输入缓冲区。如果缓冲区的大小很大,创建相同大小的缓冲区将非常昂贵。所以我想知道这样的转换函数是否可以在较小的块中写出数据,以便我们使用更小的空间?
我发现这种分块技术会导致某些程序失败,尤其是使用io.ReadFull()
和io.ReadAtLeast()
的程序。因为他们隐含地希望到达的数据来自单个read()
电话。
有人能指出一个关于如何编写这种转换函数的文档或规范吗?
谢谢!