[英]What does asterisk (*struct) notation mean in golang
// NewReaderSize returns a new Reader whose buffer has at least the specified
43 // size. If the argument io.Reader is already a Reader with large enough
44 // size, it returns the underlying Reader.
45 func NewReaderSize(rd io.Reader, size int) *Reader {
46 // Is it already a Reader?
47 b, ok := rd.(*Reader)
48 if ok && len(b.buf) >= size {
49 return b
50 }
51 if size < minReadBufferSize {
52 size = minReadBufferSize
53 }
54 r := new(Reader)
55 r.reset(make([]byte, size), rd)
56 return r
57 }
当我使用os.Open打开文件时
dictFile, err := os.Open(file)
我要把dicFile传给
reader := bufio.NewReader(dictFile)
我发现底层代码使用的是func NewReaderSize
,但我无法理解的是rd.(*Reader)
。 Reader
是包bufio
包含的结构类型。 后面跟着一个结构的星号来自我所看到的从指针Reader
获取值,但它不是一个指针,所以它没有意义。 此外,它使用点运算符rd.(*Reader)
,我完全感到困惑。 第47行这种用法的含义是什么? 它是什么样的符号?
newReaderSize
需要一个读取器( io.Reader
接口),并返回一个指针, Reader
( struct
中所定义bufio
)。
这称为类型断言:
b, ok := rd.(*Reader)
来自golang规范:
对于接口类型和类型T的表达式x ,主表达式x。(T)断言x不是nil,并且存储在x中的值是T类型。符号x。(T)称为类型断言。
这一行正在接受读者并断言它是一种*Reader
,如果它成功并且Reader
有足够大的缓冲区,它会立即返回(因为它已经是我们想要的)。
示例中第47行的语法是Type Assertion ,它将接口变量的值断言为特定类型。 具体在你的情况下,声明
b, ok := rd.(*Reader)
断言接口rd
的底层值是*Reader
类型(指向struct Reader
的值的指针),给你b
类型*Reader
和一个布尔值ok
,表示断言是否正常,底层值是否真的是类型*Reader
。
一个抽象的例子( 游戏 ):
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
所以你看,类型断言只是一种拉出接口所涵盖的值的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.