如何解释这个程序实现接口

时间:2017-07-25 05:52:02

标签: go

https://play.golang.org/p/LHkVGzmC7N

看看这个来源。

specilly这个废料:

bw := NewWriter(b)
w, ok := bw.wr.(io.ReaderFrom)

我不明白b是字节元素,NewWrite()采用io.Writer。 和bw.wr.(io.ReaderFrom),怎么用?

“。(io.ReaderFrom)”的功能是什么意思?

   fmt.Println(w.ReadFrom(s))

w是io.write,在io / io.go中,ReadFrom(s)是接口。

type ReaderFrom interface {
    ReadFrom(r Reader) (n int64, err error)
}

如何在此源中实现此接口?

在这个来源中,我找不到任何地方可以实现。

2 个答案:

答案 0 :(得分:2)

这是type assertion

在您的情况下,它断言w不是nil,w中存储的值是接口io.ReaderFromok如果是true,则为false。此代码不会检查ok变量,因为作者有信心它将实现io.ReaderFrom接口。

答案 1 :(得分:0)

  • bytes.Buffer实施func (b *Buffer) Write(p []byte) (n int, err error),因此它的类型为io.Writer,可以作为func NewWriter(w io.Writer) *Writer的参数

  • bytes.Buffer也实施了func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error),因此它的类型为io.ReadFrom,可以调用fmt.Println(w.ReadFrom(s))

  • 正如@akond提到的那样.(io.ReaderFrom)是类型断言,而表达式w, ok := bw.wr.(io.ReaderFrom)断言wr结构的Writer字段也是类型{{ 1}}

如需进一步阅读laws-of-reflection,请参阅类似的代码。