This question already has answers here:
What is this “err.(*exec.ExitError)” thing in Go code?

(2个答案)


5年前关闭。




以下是其中一个Go库的摘录。任何人都可以指出r.(byteReader)的重要性吗?对于新手来说,语法用法不是很明显。 byteReader是已定义的接口(interface),似乎不是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)
}

最佳答案

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

The specification状态:



编辑

注释“将其包装在bufio.NewReader中”是指makeReader提供的io.Reader;如果它没有实现byteReadermakeReader会将它包装在一个确实实现bufio.ReaderbytesReader中,然后返回它。

10-05 22:29