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

以下是 Go 库之一的片段。谁能指出r.(byteReader)? 语法用法对于新手来说不是很明显。byteReader是一个定义的接口,似乎不是io.Reader. 因为,这似乎是某种漂亮的代码,任何人都可以提供一些见解。


作者提到:“如果它不支持 ReadByte,则将其包装在 bufio.NewReader 中”模式。https://github.com/dave-andersen/deltagolomb/blob/master/deltagolomb.go


type 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)

}


三国纷争
浏览 183回答 1
1回答

慕斯709654

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,并返回它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go