我在golang的zlib / reader.go文件中找到了很多像r.(flate.Reader)
这样的代码片段。这是什么意思?
https://golang.org/src/compress/zlib/reader.go
func (z *reader) Reset(r io.Reader, dict []byte) error {
if fr, ok := r.(flate.Reader); ok {
z.r = fr
} else {
z.r = bufio.NewReader(r)
}
// more code omitted ...
}
P.S。源代码io
和flate
io:https://golang.org/src/io/io.go
flate:https://golang.org/src/compress/flate/inflate.go
答案 0 :(得分:5)
The Go Programming Language Specification
对于接口类型的表达式x和类型T,表示主要的 表达
x.(T)
断言x不是nil,并且存储在x中的值是T类型。 符号x。(T)称为类型断言。
用于赋值或初始化的类型断言 特殊形式
v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T)
产生一个额外的无类型布尔值。如果是,则ok的值为true 断言成立。否则它是假的,v的值是 类型T的值为零。在这种情况下,不会发生运行时混乱。 ç
r.(flate.Reader)
是一种类型断言。例如,
func (z *reader) Reset(r io.Reader, dict []byte) error {
if fr, ok := r.(flate.Reader); ok {
z.r = fr
} else {
z.r = bufio.NewReader(r)
}
// more code omitted ...
}
r
是io.Reader
类型,interface
。 fr, ok := r.(flate.Reader)
检查r
,看它是否包含io.Reader
类型flate.Reader
。