【问题标题】:Difference between os.File, io.Reader and os.Stdinos.File、io.Reader 和 os.Stdin 的区别
【发布时间】:2019-01-03 06:51:39
【问题描述】:

我在官方 go 文档中查看 NewScanner,它提到要传递给 bufio.NewScanner 的参数应该是 io.Reader 类型。但是,以下对我有用:

file, err := os.Open("filename")
scanner := bufio.NewScanner(file)

os.Stdin 也是如此。鉴于此,os.Fileos.Stdinio.Reader 之间有什么区别?它们可以互换吗?

【问题讨论】:

  • io.Reader 是一个接口。 os.File 和 os.Stdin 使用方法 Read() 实现了这个接口,可以在 io.Reader 期望的地方使用
  • @Projjol os.Fileconcrete 类型,您的 file 是该类型的变量,os.Stdin 也是该类型的变量。 io.Reader 是一个 interface 类型,os.File 类型实现了io.Reader 接口,因此值fileos.Stdin 可以用作NewScanner 的参数。
  • 感谢@Uvelichitel

标签: file go operating-system


【解决方案1】:

这是因为bufio.NewScannerio.Reader 作为参数。

func NewScanner(r io.Reader) *Scanner

io.Reader是封装了基本Read方法的接口。

type Reader interface {
        Read(p []byte) (n int, err error)
}

来自 Golang 中的os package

Open 打开指定文件进行读取。如果成功,方法上的 返回的文件可用于读取;关联的文件描述符 具有 O_RDONLY 模式。如果有错误,它将是类型 *路径错误。

func Open(name string) (file *File, err error)

返回值*os.File实现io.Reader

因此,无论实现 Reader 接口,都可以作为参数传递给任何具有 io.Reader 作为参数的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 2015-08-25
    相关资源
    最近更新 更多