我正在查看 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
- 1 回答
- 0 關注
- 175 瀏覽
添加回答
舉報
0/150
提交
取消