这是我的代码,我是Go的新手。 我曾尝试使用Google搜索该问题,但我对此完全没有把握。 我认为这与Read()方法有关。
flex-basis: 216px;
这是输出
dylan @ skynet:〜/ Documents / EXP / jc $ ./jc data.txt.jc
[./ jc data.txt.jc]
未压缩数据:2364480
2018/06/29 21:41:35意外的EOF
答案 0 :(得分:3)
您参与进来了,输出混杂在一起。
flate.NewReader
将压缩的输入作为io.Reader
,并返回一个io.ReadCloser
,可用于获取未压缩的输出:
func (r *compressor) decompress() []byte {
dc := flate.NewReader(bytes.NewReader(r.content))
defer dc.Close()
rb, err := ioutil.ReadAll(dc)
if err != nil {
if err != io.EOF {
log.Fatalf("Err %v\n read %v", err, rb)
}
}
return rb
}
答案 1 :(得分:3)
在对有问题的特定代码进行跟踪之后,我得到了以下答案。
func (r *Reader) ReadByte() (byte, error) {
...
if r.i >= int64(len(r.s)) {
return 0, io.EOF
}
....
}
字节/读取器中有四个函数可以返回io.EOF
,零个函数可以返回io.ErrUnexpectedEOF
。可以返回io.EOF
的四个函数是:
Read(b []byte)
ReadAt(b []byte, off int64)
ReadByte()
ReadRune()
/src/compress/flate/inflate.go 698
func (f *decompressor) moreBits() error {
c, err := f.r.ReadByte()
if err != nil {
return noEOF(err)
}
...
}
在可以返回io.EOF
的四个函数中,flate / inflate.go中只有一个函数调用它们中的任何一个:moreBits()
调用ReadByte()
/src/compress/flate/inflate.go 690
func noEOF(e error) error {
if e == io.EOF {
return io.ErrUnexpectedEOF
}
...
}
moreBits()
收到错误时,它将调用noEOF()
,它检查是否收到了io.EOF
。如果是这种情况,则返回io.ErrUnexpectedEOF
。一切似乎都按预期进行,似乎需要用户注意这种特殊情况。建议对上面的代码进行编辑,以处理似乎已定义的行为:
func (r *compressor) decompress() []byte {
dc := flate.NewReader(bytes.NewReader(r.content))
defer dc.Close()
rb, err := ioutil.ReadAll(dc)
if err != nil {
if err != io.EOF && err != io.ErrUnexpectedEOF {
log.Fatalf("Err %v\n read %v", err, rb)
}
}
return rb
}
已在go1.12.9
下进行了检查