如示例代码所示,该
Push方法必须具有指针接收器。
诀窍是所有对
heap.XXX函数的调用都要求您将堆作为指针传递(例如:)
heap.Init(&pq)。在您发布的代码中情况并非如此。这是您的代码的有效版本。您可以在Go操场上运行它。
请注意,在这段代码中,我明确地将队列初始化为指针:
q := new(PriorityQueue)。这就是我传递给所有
heap功能的东西。
之所以引起这种混乱,主要是因为您实际上要实现2个接口。的
heap.Interface和
sort.Interface(后者是现有的类型定义的一部分)。但是sort接口对于非指针接收器来说是很好的,而另一个接口则不是。
package mainimport "fmt"import "container/heap"func main() { q := new(PriorityQueue) heap.Init(q) fmt.Printf("nAdr: %pn", &q) q.Push(NewItem("h", 2)) for i := 0; i < 5; i++ { heap.Push(q, NewItem("test", i*13%7)) } for q.Len() > 0 { fmt.Println("Item: " + heap.Pop(q).(string)) }}type Item struct { container interface{} priority int index int}type PriorityQueue []*Itemfunc NewItem(value interface{}, prio int) *Item { return &Item{container: value, priority: prio}}func (pq PriorityQueue) Len() int { return len(pq)}func (pq PriorityQueue) Less(i, j int) bool { return pq[i].priority > pq[j].priority}func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] pq[i].index = i pq[j].index = j}func (pq *PriorityQueue) Push(x interface{}) { fmt.Printf("adr: %pn", pq) n := len(*pq) item := x.(*Item) item.index = n *pq = append(*pq, item)}func (pq *PriorityQueue) Pop() interface{} { old := *pq n := len(old) itm := old[n-1] itm.index = -1 *pq = old[0 : n-1] return itm.container}


