我在go go官方文档中查看了NewScanner,它提到要传递给bufio.NewScanner
的参数应该为io.Reader
类型。但是,以下对我有用:
file, err := os.Open("filename")
scanner := bufio.NewScanner(file)
os.Stdin
也可以看到相同的内容。鉴于此,os.File
,os.Stdin
和io.Reader
有什么区别?它们可以互换吗?
答案 0 :(得分:2)
这是因为bufio.NewScanner
以io.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。如果有错误,它将是类型 * PathError。
func Open(name string) (file *File, err error)
返回的值*os.File
实现io.Reader
。
因此,无论使用哪种实现,都可以将Reader接口作为参数传递给以io.Reader
作为参数的任何方法。