繁体   English   中英

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

[英]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接口),并返回一个指针, Readerstruct中所定义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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM