3

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

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

也可以看到同样的情况os.Stdinos.File鉴于此,os.Stdin和之间有什么区别io.Reader?它们可以互换吗?

4

1 回答 1

4

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

func NewScanner(r io.Reader) *Scanner

并且io.Reader是包装基本 Read 方法的接口。

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

来自Golang中的os 包:

打开打开指定文件进行读取。如果成功,则可以使用返回文件上的方法进行读取;相关文件描述符的模式为 O_RDONLY。如果有错误,它将是 *PathError 类型。

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

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

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

于 2018-07-26T10:05:40.513 回答