为了账号安全,请及时绑定邮箱和手机立即绑定

“如果它不支持 ReadByte,则将其包装在 bufio.NewReader 中”模式

“如果它不支持 ReadByte,则将其包装在 bufio.NewReader 中”模式

Go
三国纷争 2021-11-01 17:11:14
以下是 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;如果它没有实现byteReadermakeReader则将它包装在一个bufio.Reader实现了的 a中bytesReader,并返回它。


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信