2 回答
TA贡献1813条经验 获得超2个赞
newReaderSize
接受一个读取器(io.Reader
接口)并返回一个指向Reader
(struct
在 中定义bufio
)的指针。
这称为类型断言:
b, ok := rd.(*Reader)
从 golang 规范:
对于接口类型和类型 T 的表达式x,主要表达式x.(T)断言 x 不是 nil 并且存储在 x 中的值是类型 T。符号 x.(T) 称为类型断言.
这一行正在接受那个读者并断言它是一种类型*Reader
,如果它成功并且Reader
有足够大的缓冲区,它会立即返回(因为它已经是我们想要的)。
TA贡献1876条经验 获得超5个赞
您示例中第 47 行的语法是Type Assertion,它将接口变量的值断言为特定类型。具体来说,在你的情况下,声明
b, ok := rd.(*Reader)
将接口的基础值断言rd为 type *Reader(指向 struct 值的指针Reader),为您b提供 type*Reader和一个布尔值ok,指示断言是否正确以及基础值是否确实是 type *Reader。
一个抽象的例子(play):
type readerA struct {}
func Read(a []byte) (int, error) {}
type readerB struct {}
func Read(a []byte) (int, error) {}
func TakesAReader(r io.Reader) {
val, ok := r.(*readerA)
fmt.Println(val, ok)
}
TakesAReader(&readerA{}) // prints &{}, true
TakesAReader(&readerB{}) // prints nil, false
所以你看,类型断言只是一种提取接口覆盖的值的方法。
- 2 回答
- 0 关注
- 860 浏览
添加回答
举报