基于Rob Pike的負載均衡器演示,我實現了自己的優先級隊列,但是我的Pop方法不正確,任何人都可以告訴我哪里出了問題嗎?package mainimport ( "fmt" "container/heap")type ClassRecord struct { name string grade int}type RecordHeap []*ClassRecordfunc (p RecordHeap) Len() int { return len(p) }func (p RecordHeap) Less(i, j int) bool { return p[i].grade < p[j].grade}func (p *RecordHeap) Swap(i, j int) { a := *p a[i], a[j] = a[j], a[i]}func (p *RecordHeap) Push(x interface{}) { a := *p n := len(a) a = a[0 : n+1] r := x.(*ClassRecord) a[n] = r *p = a}func (p *RecordHeap) Pop() interface{} { a := *p *p = a[0 : len(a)-1] r := a[len(a)-1] return r}func main() { a := make([]ClassRecord, 6) a[0] = ClassRecord{"John", 80} a[1] = ClassRecord{"Dan", 85} a[2] = ClassRecord{"Aron", 90} a[3] = ClassRecord{"Mark", 65} a[4] = ClassRecord{"Rob", 99} a[5] = ClassRecord{"Brian", 78} h := make(RecordHeap, 0, 100) for _, c := range a { fmt.Println(c) heap.Push(&h, &c) fmt.Println("Push: heap has", h.Len(), "items") } for i, x := 0, heap.Pop(&h).(*ClassRecord); i < 10 && x != nil; i++ { fmt.Println("Pop: heap has", h.Len(), "items") fmt.Println(*x) }}編輯:除了cthom06指出的方式,另一種解決此問題的方法是創建一個指針數組,如下所示,a := make([]*ClassRecord, 6)a[0] = &ClassRecord{"John", 80}a[1] = &ClassRecord{"Dan", 85}......
1 回答

慕仙森
TA貢獻1827條經驗 獲得超8個贊
編輯:
哦,我應該馬上看到這個。
heap.Push(&h, &c)
您推入c的地址,該地址將在范圍的每次迭代中重用。堆中的每個記錄都是一個指向內存中同一區域的指針,最終成為Brian。我不確定這是預期的行為還是編譯器錯誤,但是
t := c
heap.Push(&h, &t)
解決它。
另外:您的for循環是錯誤的。
for h.Len() > 0 {
x := heap.Pop(&h...
應該修復它。
- 1 回答
- 0 關注
- 252 瀏覽
添加回答
舉報
0/150
提交
取消