英文:
Go priority queues - assigning a sub-slice
问题
我正在阅读Go标准库中的优先队列这里,并且我正在看这段代码:
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
old[n-1] = nil // 避免内存泄漏
item.index = -1 // 为了安全起见
*pq = old[0 : n-1]
return item
}
我对从优先队列中弹出元素的这种方法有些担忧。我知道在这个例子中,PriorityQueue
类型是一个指针切片,切片是引用类型,所以old := *pq
只是将切片的引用赋值给了old
,并没有实际复制任何内容,但是*pq = old[0 : n-1]
这一行代码是做什么的?它是创建了另一个切片,还是只是复制了一个引用,将起始和结束索引设置为0
和n-1
?
我想在可能有大量元素的优先队列中使用这个类,并且我想避免不必要的复制。
英文:
I'm reading priority queues in the Go standard library here and I'm looking at this code
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
}
I'm somewhat concerned about this method of popping elements from a priority queue.. I know that a PriorityQueue
type is a slice of pointers in that example and that a slice is a reference type so old := *pq
only assigns the reference to the slice and doesn't actually copy anything, but what does the line *pq = old[0 : n-1]
do? Does it create another slice or just copies a reference of the old slice with the begin-end indices set to 0
and n-1
?
I'd like to use this class for a priority queue with potentially lots and lots of items and I'd like to avoid unnecessary copies.
答案1
得分: 0
old := *pq
会复制 pq
指向的内容。
复制切片会进行浅拷贝 - 复制的切片与原始切片共享同一个数组。
*pq = old[0 : n-1]
创建一个比原始切片短 1 个元素的新切片,并与原始切片共享同一个数组。
复制切片的成本较低,而复制底层数组的成本较高。
在使用切片时,强烈建议阅读:Go 切片:用法和内部原理
英文:
old := *pq
makes a copy of whatever pq
is pointing at.
Copying a slice makes a shallow copy - the copy is backed by the same array as the original slice.
*pq = old[0 : n-1]
creates a new slice that is 1 element shorter and is backed by the same array.
Copying a slice is cheap, copying the backing array is expensive.
Mandatory read when working with slices: Go Slices: usage and internals
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论