我正在尝试io.ReaderCloser使用可以传递给 JSON 解码器的自定义阅读器来包装一个,它在生产中将来自请求处理程序。我创建了以下import ( "io")// RemoveNull is a stream wrapper that should remove null bytes from the byte streamtype RemoveNull struct { Reader io.ReadCloser}// NewRemoveNullStream creates a new RemoveNull reader which passes the stream through a null check firstfunc NewRemoveNullStream(reader io.ReadCloser) RemoveNull { return RemoveNull{ Reader: reader, }}// Read wraps a Reader to remove null bytes in the streamfunc (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 readerfunc (null RemoveNull) Close() error { return null.Close()}当我运行以下命令时,我可以从 print 语句中看到确实删除了所有空字节,并且 len(p) == 所有预期好字节的大小。我写了下面的测试,看看代码是否按我的预期工作,这就是我意识到它不是的地方。从测试中我可以看到解码时所有空字节仍然存在,但在 RemoveNull 阅读器中我可以看到所有空字节都已从下划线数组中删除。关于什么是错的以及如何实现从流中删除字节以避免让解码器解码空字节的目标的任何想法?
1 回答
DIEA
TA贡献1820条经验 获得超2个赞
您的 Read 实现中存在错误。它在 io.EOF 的情况下过早终止,其中同时存在错误和数据。它返回读取的错误字节数。分配切片的最后一部分也没有意义,因为它不会更新传递给函数的切片。
尝试这个:
func (null RemoveNull) Read(p []byte) (n int, err error) {
n, err = null.Reader.Read(p)
nn := 0
for i:=0;i<n;i++ {
if p[i] != 0 {
p[nn] = p[i]
nn++
}
}
return nn, err
}
- 1 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消