以下是其中一个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)
}
答案 0 :(得分: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
的{{1}}中,并将其返回。