提问人:Benek 提问时间:2/19/2023 更新时间:2/19/2023 访问量:60
LimitedReader 仅读取一次
LimitedReader reads only once
问:
我试图通过学习 gopl 书来理解围棋。我在尝试实现该功能时被卡住了。我意识到我有两个问题,所以让我把它们分开。LimitReader
第一期
官方文档的描述是:
LimitedReader 从 R 读取数据,但将返回的数据量限制为仅 N 个字节。每次调用 Read 都会更新 N 以反映剩余的新量。当 N <= 0 或基础 R 返回 EOF 时,Read 返回 EOF。
好的,所以我的理解是我可以多次从类型中读取,但我将始终被限制在字节内。运行此代码向我展示了一些不同的东西:io.Reader
N
package main
import (
"fmt"
"io"
"log"
"strings"
)
func main() {
r := strings.NewReader("some io.Reader stream to be read\n")
lr := io.LimitReader(r, 4)
b := make([]byte, 7)
n, err := lr.Read(b)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Read %d bytes: %s\n", n, b)
b = make([]byte, 5)
n, _ = lr.Read(b)
// If removed because EOF
fmt.Printf("Read %d bytes: %s\n", n, b)
}
// Output:
// Read 4 bytes: some
// Read 0 bytes:
// I expect next 4 bytes instead
这种类型的对象似乎只能读取一次。不太确定,但也许io.go源代码中的这一行可以更改为.主要问题是为什么这段代码与文档描述不一致?l.N = 0
第二期
当我遇到第一个问题时,我试图显示当前值。如果我把上面的代码放进去,它就无法编译。我意识到我仍然不理解 Go 接口的概念。N
fmt.Println(lr.N)
lr.N undefined (type io.Reader has no field or method N)
这是我的 POV(基于上面的列表)。使用函数 I create 对象(见源代码)。由于此对象包含具有正确签名的方法,因此其接口类型为 。这就是回报的原因,对吧?好的,所以一切都可以协同工作。io.LimitReader
LimitedReader
Read
io.Reader
io.LimitReader
io.Reader
问题是:为什么无法访问?正如我正确理解的那样,接口类型只要求数据类型包含一些方法。而已。lr.N
答:
LimitedReader
限制可读取的数据总大小,而不是每次读取调用时可读取的数据量。也就是说,如果将限制设置为 4,则可以执行 4 次 1 字节的读取,或 1 次读取 4 个字节,之后,所有读取都将失败。
对于你的第二个问题:是一个 ,所以你看不懂。但是,您可以使用类型断言访问基础具体类型:应该有效。lr
io.Reader
lr.N
lr.(*io.LimitedReader).N
评论