不知道为什么,但我的io.Reader
实现似乎存在某种缺陷?
io.Reader
的文档说明返回非零字节计数和非零错误应该是正常的:
它可以从同一调用返回(非零)错误,或者从后续调用返回错误(且n==0).这种一般情况的一个例子是,在输入流的末尾返回非零字节数的读取器可能返回ERR==EOF或ERR==NIL.下一次读取应返回0,EOF.
在考虑错误之前,调用方应始终处理返回的n>;0字节.这样做可以正确地处理在读取某些字节之后发生的I/O错误以及允许的两种EOF行为.
但这对fmt.Fscan
不起作用,而是挂起了程序:
package main
import (
"fmt"
"io"
)
type Byte byte
func (b Byte) Read(p []byte) (n int, err error) {
if len(p) == 0 {
return 0, io.ErrShortBuffer
}
p[0] = byte(b)
return 1, io.EOF
}
func main() {
var n int
b := Byte('9')
z, err := fmt.Fscan(b, &n)
fmt.Println(n, z, err)
}
当然,如果我单独返回一个包含io.EOF
的零字节数,那么它是有效的:
type Byte struct {
v byte
eof bool
}
func (b *Byte) Read(p []byte) (n int, err error) {
if len(p) == 0 {
return 0, io.ErrShortBuffer
}
if b.eof {
return 0, io.EOF
}
p[0] = b.v
b.eof = true
return 1, nil
}
func main() {
var n int
b := Byte{v: '9'}
z, err := fmt.Fscan(&b, &n)
fmt.Println(n, z, err)
}
我的原始实现中是否存在缺陷,或者我是否应该简单地不依赖于这位记录在案的io.Reader
行为,并在没有更多数据可读时始终单独返回0, io.EOF
?