golang中的星号(* struct)表示法是什么意思

时间:2014-03-27 16:13:45

标签: struct go

// 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行这种用法的含义是什么?它是什么样的符号?

2 个答案:

答案 0 :(得分:3)

newReaderSize使用读者(io.Reader接口)并返回指向Reader中定义的structbufio)的指针。

这称为类型断言:

b, ok := rd.(*Reader)

来自golang spec:

  

对于接口类型的表达式x和类型T,表示主要的   表达式 x。(T)断言x不是nil且存储的值   in x的类型为T.符号x。(T)称为类型断言。

这一行正在吸引读者并断言它是一种*Reader,如果它成功并且Reader具有足够大的缓冲区,它会立即返回(因为它已经是我们想要的了) )。

答案 1 :(得分:3)

示例中第47行的语法是Type Assertion,它将接口变量的值断言为特定类型。具体在你的情况下,声明

b, ok := rd.(*Reader)

断言接口rd的基础值为*Reader类型(指向struct Reader的值的指针),为您提供类型为{b的{​​{1}} 1}}和一个布尔值*Reader,指示断言是否正常,基础值是否真的是ok类型。

抽象示例(play):

*Reader

所以你看,键入断言只是提取接口所涵盖的值的一种方法。