我正在尝试io.ReaderCloser使用可以传递给 JSON 解码器的自定义阅读器来包装一个,它在生产中将来自请求处理程序。
我创建了以下
import (
"io"
)
// RemoveNull is a stream wrapper that should remove null bytes from the byte stream
type RemoveNull struct {
Reader io.ReadCloser
}
// NewRemoveNullStream creates a new RemoveNull reader which passes the stream through a null check first
func NewRemoveNullStream(reader io.ReadCloser) RemoveNull {
return RemoveNull{
Reader: reader,
}
}
// Read wraps a Reader to remove null bytes in the stream
func (null RemoveNull) Read(p []byte) (n int, err error) {
n, err = null.Reader.Read(p)
if err != nil {
return n, err
}
nn := 0
for i := range p {
if p[i] != 0 {
p[nn] = p[i]
nn++
}
}
p = p[:nn]
// fmt.Println(p) i can see the value of p changing and all the null bytes are removed
return n, nil
}
// Close closes the internal reader
func (null RemoveNull) Close() error {
return null.Close()
}
当我运行以下命令时,我可以从 print 语句中看到确实删除了所有空字节,并且 len(p) == 所有预期好字节的大小。我写了下面的测试,看看代码是否按我的预期工作,这就是我意识到它不是的地方。
从测试中我可以看到解码时所有空字节仍然存在,但在 RemoveNull 阅读器中我可以看到所有空字节都已从下划线数组中删除。关于什么是错的以及如何实现从流中删除字节以避免让解码器解码空字节的目标的任何想法?
DIEA
相关分类