Go &引用;如果没有';t支持ReadByte";图案

Go &引用;如果没有';t支持ReadByte";图案,go,Go,以下是其中一个Go lib的片段。有人能指出r.(byteReader)的意义吗?语法用法对新手来说不是很明显byteReader是一个已定义的接口,似乎不是io.Reader的成员。因为,这似乎是某种漂亮的代码,任何人都可以提供一些见解 作者提到:“如果它不支持ReadByte模式,就用bufio.NewReader包装它。” r.(byteReader)称为类型断言。即使io.Reader本身没有实现byteReader接口,存储在r中的值也可能实现byteReader。因此,通过执行类型断

以下是其中一个Go lib的片段。有人能指出
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)
}