LimitedReader 仅读取一次

LimitedReader reads only once

提问人:Benek 提问时间:2/19/2023 更新时间:2/19/2023 访问量:60

问:

我试图通过学习 gopl 书来理解围棋。我在尝试实现该功能时被卡住了。我意识到我有两个问题,所以让我把它们分开。LimitReader

第一期

官方文档的描述是:

LimitedReader 从 R 读取数据,但将返回的数据量限制为仅 N 个字节。每次调用 Read 都会更新 N 以反映剩余的新量。当 N <= 0 或基础 R 返回 EOF 时,Read 返回 EOF。

好的,所以我的理解是我可以多次从类型中读取,但我将始终被限制在字节内。运行此代码向我展示了一些不同的东西:io.ReaderN

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 接口的概念。Nfmt.Println(lr.N)lr.N undefined (type io.Reader has no field or method N)

这是我的 POV(基于上面的列表)。使用函数 I create 对象(见源代码)。由于此对象包含具有正确签名的方法,因此其接口类型为 。这就是回报的原因,对吧?好的,所以一切都可以协同工作。io.LimitReaderLimitedReaderReadio.Readerio.LimitReaderio.Reader

问题是:为什么无法访问?正如我正确理解的那样,接口类型只要求数据类型包含一些方法。而已。lr.N

GO 接口 IO 读卡器

评论


答:

3赞 Burak Serdar 2/19/2023 #1

LimitedReader限制可读取的数据总大小,而不是每次读取调用时可读取的数据量。也就是说,如果将限制设置为 4,则可以执行 4 次 1 字节的读取,或 1 次读取 4 个字节,之后,所有读取都将失败。

对于你的第二个问题:是一个 ,所以你看不懂。但是,您可以使用类型断言访问基础具体类型:应该有效。lrio.Readerlr.Nlr.(*io.LimitedReader).N