以下是其中一个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)
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,并返回它.