我在学习Reader的时候,发现有io.Reader和strings.Reader:
io.Reader:
type Reader interface {
Read(p []byte) (n int, err error)
}
strings.Reader:
type Reader struct {
s string
i int64 // current reading index
prevRune int // index of previous rune; or < 0
}
请问一下,io.Reader是一个接口,strings.Reader是一个结构体,它们之间看起来没有任何关系呀。
我在看这个教程的时候,
https://blog.csdn.net/preyta/...
发现示例中传入的是strings.Reader而不是io.Reader,但是应该传入io.Reader:
r := strings.NewReader("hello world !") // strings.Reader io.Reader
reader := bufio.NewReader(r)
这里io.Reader和strings.Reader有内在联系吗?我怎么没有发现呢?请指点迷津。
strings.Reader有个方法
func (r *Reader) Read(b []byte) (n int, err error)
这与io.Reader中的定义一致, 所以strings.Reader实现了io.Reader.
所有需要io.Reader作为参数的地方, 都可以用strings.Reader.
至于bufio.NewReader的参数
io.Reader
, 因为io.Reader
是一个interface也就是一个抽象(即它无法被实例化), 所以你永远也不可能传入一个类型为io.Reader
的参数,而只能可能传入一个实现了
func (r *Reader) Read(b []byte) (n int, err error)
方法的对象.