在golang的zlib / reader.go文件中,“r。(flate.Reader)”是什么意思?

时间:2015-10-29 03:16:14

标签: go

我在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。源代码ioflate io:https://golang.org/src/io/io.go
flate:https://golang.org/src/compress/flate/inflate.go

1 个答案:

答案 0 :(得分:5)

  

The Go Programming Language Specification

     

Type assertions

     

对于接口类型的表达式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 ...
}

rio.Reader类型,interfacefr, ok := r.(flate.Reader)检查r,看它是否包含io.Reader类型flate.Reader