Golang Go语言中标准库 container/heap 的一个疑问

发布于 1周前 作者 songsunli 来自 Go语言

Golang Go语言中标准库 container/heap 的一个疑问

container/heap 中的 Pop 方法,从堆当中移出一个元素,如果当前堆为空,那么调用 heap.Pop() 方法就会报错。

panic: runtime error: index out of range [0] with length 0

代码中确实没有对长度为 0 时的情况进行特殊处理。

// Pop removes and returns the minimum element (according to Less) from the heap.
// The complexity is O(log n) where n = h.Len().
// Pop is equivalent to Remove(h, 0).
func Pop(h Interface) interface{} {
	n := h.Len() - 1
	h.Swap(0, n)
	down(h, 0, n)
	return h.Pop()
}

我的疑问是为什么对这个情况不做处理?


更多关于Golang Go语言中标准库 container/heap 的一个疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

容器有没有元素肯定要自己判断呀,不然给你返回啥?

1. pop 返回 nil (???
2. pop 返回元素+error (???
你觉得哪种好?

更多关于Golang Go语言中标准库 container/heap 的一个疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


楼主欢迎你加入中国人改造 go 社区,我们一起修改这个接口吧,返回值加入 error 即可,就为了跟英语世界不一样改它

关于你在 Golang 中对标准库 container/heap 的疑问,这里提供一些专业的解答。

container/heap 是 Go 语言标准库中的一个接口,它提供了一个通用的堆(优先队列)实现。这个接口是围绕 sort.Interface 构建的,允许你使用任何实现了 sort.Interface 的类型来作为堆。

首先,要实现一个堆,你需要定义一个类型,并为其实现 sort.Interface 的三个方法:Len()Less(i, j int) boolSwap(i, j int)。这三个方法分别定义了堆的大小、元素的比较规则以及元素交换的逻辑。

其次,你需要实现 heap.Interface 的两个方法:Push(x interface{})Pop() interface{}。这两个方法用于向堆中添加和移除元素。在你的具体实现中,PushPop 方法通常会操作一个底层的切片([]interface{}[]T,其中 T 是你的自定义类型)。

最后,你可以使用 heap.Initheap.Pushheap.Popheap.Fix 等函数来管理你的堆。例如,heap.Init 用于初始化一个堆,heap.Pushheap.Pop 分别用于向堆中添加和移除元素,而 heap.Fix 则用于在修改了堆中的元素后恢复堆的性质。

希望这些解答能够帮助你更好地理解 container/heap 的使用。如果你有更具体的问题或遇到了困难,欢迎继续提问。

回到顶部