2016-03-26 39 views
4

我看着golang的堆包的(https://golang.org/pkg/container/heap/)优先级队列例子,碰到这样的:Golang指针切片和阵列

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

+0

不,“pq”是一个变量。 '(* pq)'是变量的解引用运算符。所以'(* pq)[0]'相当于'a:= * pq;一个[0]'。 – joshlf

回答

5

你不是类型断言什么工作 - 这是操作顺序。

问题的根源在于索引先于指针的解引用。一旦你在指针解引用周围放置了大括号,它就可以正常工作,因为索引被应用于现在取消引用的PriorityQueue实例。

你不需要做就是数组指针,因为它们是自动解引用 - 索引阵列和切片之间的微小差异在此说明:The Go Programming Language Specification - Index expressions

对于数组类型Aa

  • 恒定索引必须是在范围
  • 如果x超出范围在运行时,运行时混乱时
  • a[x]是数组元素在索引xa[x]类型是的A

对于指针的a到阵列型元件类型:

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

对于切片类型Sa

  • 如果x超出范围在运行时,运行时混乱时
  • a[x]是在索引x切片元件和a[x]类型是元素类型S
+0

非常有意义。谢谢! – khalieb

+0

指向切片类型的指针呢?@Dimitar Dimitrov – kamal