我在这里阅读 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?我想将此类用于可能包含大量项目的优先级队列,并且我想避免不必要的副本。
1 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
old := *pq
复制任何pq
指向的东西。
复制切片会产生浅拷贝 - 副本由与原始切片相同的数组支持。
*pq = old[0 : n-1]
创建一个短 1 个元素并由同一数组支持的新切片。
复制切片很便宜,复制后备数组很昂贵。
使用切片时必读:Go Slices: usage and internals
- 1 回答
- 0 关注
- 86 浏览
添加回答
举报
0/150
提交
取消