去优先级队列 - 分配一个子片

我在这里阅读 Go 标准库中的优先级队列,我正在查看这段代码

func (pq *PriorityQueue) Pop() interface{} {

    old := *pq

    n := len(old)

    item := old[n-1]

    old[n-1] = nil  // avoid memory leak

    item.index = -1 // for safety

    *pq = old[0 : n-1]

    return item

}

我有点担心这种从优先级队列中弹出元素的方法。我知道PriorityQueue在该示例中类型是指针的切片,并且切片是引用类型,因此old := *pq仅将引用分配给切片而不是实际上复制任何东西,但是这条线*pq = old[0 : n-1]有什么作用?它是创建另一个切片还是仅复制旧切片的引用,并将开始-结束索引设置为0and n-1?


我想将此类用于可能包含大量项目的优先级队列,并且我想避免不必要的副本。


ibeautiful
浏览 89回答 1
1回答

扬帆大鱼

old := *pq复制任何pq指向的东西。复制切片会产生浅拷贝 - 副本由与原始切片相同的数组支持。*pq = old[0 : n-1]创建一个短 1 个元素并由同一数组支持的新切片。复制切片很便宜,复制后备数组很昂贵。使用切片时必读:Go Slices: usage and internals
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go