为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2021-07-28 20:15:25
// NewReaderSize returns a new Reader whose buffer has at least the specified43  // size. If the argument io.Reader is already a Reader with large enough44  // 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 b50      }51      if size < minReadBufferSize {52          size = minReadBufferSize53      }54      r := new(Reader)55      r.reset(make([]byte, size), rd)56      return r57  }当我使用 os.Open 打开文件时dictFile, err := os.Open(file)我要将 dicFile 传递给reader := bufio.NewReader(dictFile)我发现底层代码正在使用 func NewReaderSize,但我无法理解的是rd.(*Reader). Reader是包中包含的结构类型bufio。星号后跟一个结构体是我看到的从指针中获取值的内容Reader,但它不是指针,因此没有意义。此外,它使用点运算符rd.(*Reader),我完全感到困惑。第47行的这种用法是什么意思?它是一种什么样的符号?
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

newReaderSize接受一个读取器(io.Reader接口)并返回一个指向Readerstruct在 中定义bufio)的指针。

这称为类型断言:

b, ok := rd.(*Reader)

从 golang 规范:

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

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


查看完整回答
反对 回复 2021-08-02
?
慕运维8079593

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

所以你看,类型断言只是一种提取接口覆盖的值的方法。



查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 860 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信