指向切片和数组的指针 [英] Pointer to slice and array

查看:26
本文介绍了指向切片和数组的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在查看Go的堆包(https://golang.org/pkg/container/heap/)优先级队列示例时遇到了这样的情况:

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

推荐答案

适合您的不是类型断言,而是操作顺序。

问题的根源在于索引先于指针的取消引用。一旦您用大括号括起指针取消引用,一切都会正常工作,因为索引将应用于现在取消引用的PriorityQueue实例。

您不需要对数组指针执行此操作,因为它们会自动解除引用-下面解释索引数组和片之间的细微差别:The Go Programming Language Specification - Index expressions

对于数组类型Aa

  • 常量索引必须在范围内
  • 如果x在运行时超出范围,则会发生运行时死机
  • a[x]是索引x的数组元素,a[x]的类型是A
  • 的元素类型

fora指向数组类型的指针:

  • a[x](*a)[x]
  • 的缩写

对于切片类型Sa

  • 如果x在运行时超出范围,则会发生运行时死机
  • a[x]是索引x的切片元素,a[x]的类型是S
  • 的元素类型

这篇关于指向切片和数组的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆