"如果它不支持ReadByte"将其包装在bufio.NewReader中。图案

时间:2015-08-31 06:33:44

标签: go

以下是其中一个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)
}

1 个答案:

答案 0 :(得分:6)

r.(byteReader)称为类型断言。即使io.Reader本身没有实现byteReader接口,但r中存储的值仍可能实现byteReader。因此,通过执行类型断言,您可以断言是否是这种情况:

The specification州:

  

x。(T)断言x不是nil,而x中存储的值是   类型T.符号x。(T)称为类型断言   ...
  如果T是   接口类型,x。(T)断言x的动态类型实现   界面T。

修改

评论“将其包装在bufio.NewReader”中,是指makeReader提供的io.Reader;如果它没有实现byteReadermakeReader会将其包含在实现bufio.Reader的{​​{1}}中,并将其返回。