2016-03-26 40 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