io.Reader和strings.Reader有什么关联?

我在学习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有内在联系吗?我怎么没有发现呢?请指点迷津。

回复
阅读 832
1 个回答

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)方法的对象.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏