"将它包装在bufio.NewReader中,如果它不支持ReadByte"模式

use*_*986 1 go

以下是其中一个Go库的片段.任何人都可以指出其意义r.(byteReader)吗?新手的语法用法不是很明显.byteReader是一个已定义的接口,似乎不是其成员io.Reader.既然,这似乎是某种漂亮的代码,任何人都可以提供一些见解.

作者提到:"将它包装在bufio.NewReader中,如果它不支持ReadByte"模式.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)
}
Run Code Online (Sandbox Code Playgroud)

ANi*_*sus 6

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实现的bytesReader,并返回它.