Go &引用;如果没有';t支持ReadByte";图案
以下是其中一个Go lib的片段。有人能指出Go &引用;如果没有';t支持ReadByte";图案,go,Go,以下是其中一个Go lib的片段。有人能指出r.(byteReader)的意义吗?语法用法对新手来说不是很明显byteReader是一个已定义的接口,似乎不是io.Reader的成员。因为,这似乎是某种漂亮的代码,任何人都可以提供一些见解 作者提到:“如果它不支持ReadByte模式,就用bufio.NewReader包装它。” r.(byteReader)称为类型断言。即使io.Reader本身没有实现byteReader接口,存储在r中的值也可能实现byteReader。因此,通过执行类型断
r.(byteReader)
的意义吗?语法用法对新手来说不是很明显byteReader
是一个已定义的接口,似乎不是io.Reader
的成员。因为,这似乎是某种漂亮的代码,任何人都可以提供一些见解
作者提到:“如果它不支持ReadByte模式,就用bufio.NewReader包装它。”
r.(byteReader)
称为类型断言。即使io.Reader
本身没有实现byteReader
接口,存储在r
中的值也可能实现byteReader
。因此,通过执行类型断言,您可以断言:
国家:
x、 (T)断言x不是零,并且存储在x中的值是零
类型T。符号x.(T)称为类型断言。…
如果T是 接口类型x.(T)断言x的动态类型实现 接口T 编辑 注释“用bufio.NewReader包装它”指的是
makeReader
提供的io.Reader
;如果它没有实现byteReader
,makeReader
将它包装在一个bufio.Reader
中,它实现了byteReader
,并返回它。r.(byteReader)
称为类型断言。即使io.Reader
本身没有实现byteReader
接口,存储在r
中的值也可能实现byteReader
。因此,通过执行类型断言,您可以断言:
国家:
x、 (T)断言x不是零,并且存储在x中的值是零
类型T。符号x.(T)称为类型断言。…
如果T是 接口类型x.(T)断言x的动态类型实现 接口T 编辑
注释“用bufio.NewReader包装它”指的是
makeReader
提供的io.Reader
;如果它没有实现byteReader
,makeReader
将它包装在一个bufio.Reader
中,它实现bytesReader
,并返回它。@Ainar-G它们在断言另一个接口(如本例)还是非接口类型(如另一个问题)上略有不同@Ainar-G它们在断言另一个接口(如本例)还是非接口类型(如另一个问题)方面略有不同
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)
}