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)
}
如何在此源中实现此接口?
在这个来源中,我找不到任何地方可以实现。
答案 0 :(得分:2)
在您的情况下,它断言w
不是nil,w
中存储的值是接口io.ReaderFrom
。 ok
如果是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,请参阅类似的代码。