正在回答 回答被采纳积分+1
同学已经研究的很深入了,找到了这个默认长度4096。是这样的,使用Scanner不会有问题。但是我们这里的Read函数必须针对所有的参数都适用,而不是仅能配合Scanner使用。
我们强行分配一个大小为1的缓冲区:
buf := make([]byte, 1)
g.Read(buf)
这样就可以使它出错。
解决的方法比较直接,我们把intGen类型做成一个struct而不是函数,用currentReader来保存读了一半的数:
type intGen struct {
gen func() int
currentReader io.Reader
}
在func(g *intGen) Read(p []byte)中,我们:
currentReader存了之前读了一半的数据,首先尝试从currentReader读取数据。
若读到了EOF,说明之前的数据读完,我们就要调用gen()函数生成下一个数,并生成新的currentReader
如果步骤1中没有读到任何数据就直接返回了EOF,那么从新的currentReader再次尝试读取。(反之有可能读到了一个尾巴,并且读到EOF,这样我们不需要再次读取)
完整代码:
type intGen struct {
gen func() int
currentReader io.Reader
}
func (g *intGen) Read(
p []byte) (n int, err error) {
err = io.EOF
if g.currentReader != nil {
n, err = g.currentReader.Read(p)
}
if err == io.EOF {
next := g.gen()
s := fmt.Sprintf("%d", next)
g.currentReader = strings.NewReader(s)
if n == 0 {
n, err = g.currentReader.Read(p)
}
}
return n, err
}
Go playground运行结果:https://play.studygolang.com/p/gQKQtbHKfRL
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星