func (p *PriorityQueue) Pop() (interface{}, int64) {
	if len(*p.itemHeap) == 0 {
		return nil, 0
	}
	item := heap.Pop(p.itemHeap).(*item)
	delete(p.lookup, item.value)
	return item.value, item.priority
}
Pop removes the element with the highest priority from the queue and returns it.
package common
import (
	"container/heap"
)
type PriorityQueue struct {
	itemHeap *itemHeap
	lookup   map[interface{}]*item
}
func NewPrque() *PriorityQueue {
	return &PriorityQueue{
		itemHeap: &itemHeap{},
		lookup:   make(map[interface{}]*item),
	}
}
func (p *PriorityQueue) Len() int {
	return p.itemHeap.Len()
}
func (p *PriorityQueue) Empty() bool {
	return p.itemHeap.Len() == 0
}
func (p *PriorityQueue) Push(v interface{}, priority int64) {
	_, ok := p.lookup[v]
	if ok {
		return
	}
	newItem := &item{
		value:    v,
		priority: priority,
	}
	heap.Push(p.itemHeap, newItem)
	p.lookup[v] = newItem
}