登录
首页 >  Golang >  Go问答

Go 优先级队列 - 子切片分配

来源:stackoverflow

时间:2024-02-17 10:27:26 180浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《Go 优先级队列 - 子切片分配》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在阅读 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] 行有什么作用?它是创建另一个切片还是仅复制旧切片的引用,并将开始结束索引设置为 0n-1

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


正确答案


old := *pq 复制 pq 所指向的内容。

复制切片会生成浅表副本 - 该副本由与原始切片相同的数组支持。

*pq = old[0 : n-1] 创建一个短 1 个元素的新切片,并由同一数组支持。

复制切片的成本较低,复制后备数组的成本较高。

使用切片时必须读取:Go Slices: usage and internals

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>