为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ibeautiful 2022-10-17 16:09:55
我在这里阅读 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


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信