gpt4 book ai didi

struct - 星号(* struct)符号在golang中是什么意思

转载 作者:IT王子 更新时间:2023-10-29 00:56:40 29 4
gpt4 key购买 nike

// 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 中包含的结构类型。 Asterisk 后跟一个struct 是从我看到的从指针Reader 获取值,但它不是指针,所以它没有意义。此外,它使用点运算符 rd.(*Reader),我完全被搞糊涂了。第 47 行的这种用法是什么意思?它是一种什么样的符号?

最佳答案

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

b, ok := rd.(*Reader)

断言接口(interface) rd 的基础值是 *Reader 类型(指向结构 Reader 值的指针),给出*Reader 类型的 b 和一个 bool 值 ok 指示断言是否正确以及底层值是否真的是 类型*阅读器

一个抽象的例子(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

所以你看,类型断言只是提取接口(interface)所涵盖的值的一种方式。

关于struct - 星号(* struct)符号在golang中是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693275/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com