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

指向切片和数组的指针

指向切片和数组的指针

Go
慕姐8265434 2021-12-27 17:47:01
我正在查看 Go 的堆包 ( https://golang.org/pkg/container/heap/ ) Priority Queue 示例并遇到了这个:type PriorityQueue []*Item...func (pq *PriorityQueue) Pop() interface{} {    old := *pq    n := len(old)    item := old[n-1]    item.index = -1 // for safety    *pq = old[0 : n-1]    return item} 当我开始玩弄这段代码以确保我理解它时,我尝试了:item := *pq[0] // error这使您键入 *[]T 不支持索引。但如果你这样做:item := (*pq)[0] // all is well这是类型断言吧?希望有人能解释这里发生了什么。这是一些快速显示的代码:https : //play.golang.org/p/uAzYASrm_Q
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

对您有用的不是类型断言 - 它是操作顺序。

问题的根源在于索引先于指针的取消引用。一旦将大括号放在指针解除引用周围,一切都会很好,因为索引应用于现在解除引用的PriorityQueue实例。

您不需要对数组指针执行此操作,因为它们会自动取消引用 - 索引数组和切片之间的细微差别在这里解释:Go 编程语言规范 - 索引表达式

对于a数组类型A

  • 常量索引必须在范围内

  • 如果x在运行时超出范围,则会发生运行时恐慌

  • a[x]在索引的数组元素x的类型和a[x]被的元素类型A

对于a指向数组类型的指针:

  • a[x] 是简写 (*a)[x]

对于a切片类型S

  • 如果x在运行时超出范围,则会发生运行时恐慌

  • a[x]在索引片元件x的类型和a[x]被的元素类型S


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号