以下是 Go 库之一的片段。谁能指出r.(byteReader)? 语法用法对于新手来说不是很明显。byteReader是一个定义的接口,似乎不是io.Reader. 因为,这似乎是某种漂亮的代码,任何人都可以提供一些见解。作者提到:“如果它不支持 ReadByte,则将其包装在 bufio.NewReader 中”模式。https://github.com/dave-andersen/deltagolomb/blob/master/deltagolomb.gotype byteReader interface { io.Reader ReadByte() (c byte, err error)}func makeReader(r io.Reader) byteReader { if rr, ok := r.(byteReader); ok { return rr } return bufio.NewReader(r)}
1 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
r.(byteReader)
称为类型断言。即使io.Reader
本身没有实现byteReader
接口,存储在其中的值仍然有r
可能实现byteReader
. 因此,通过进行类型断言,您可以断言是否是这种情况:
规范指出:
x.(T) 断言 x 不是 nil 并且存储在 x 中的值是 T 类型。符号 x.(T) 称为类型断言。
...
如果 T 是接口类型,则 x.(T) 断言 x 的动态类型实现了接口 T。
编辑
注释“将其包装在 bufio.NewReader 中”是指makeReader
提供的io.Reader
;如果它没有实现byteReader
,makeReader
则将它包装在一个bufio.Reader
实现了的 a中bytesReader
,并返回它。
- 1 回答
- 0 关注
- 172 浏览
添加回答
举报
0/150
提交
取消