指向切片和数组的指针 [英] Pointer to slice and array
本文介绍了指向切片和数组的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在查看Go的堆包(https://golang.org/pkg/container/heap/)优先级队列示例时遇到了这样的情况:
type PriorityQueue []*Item
...
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
item.index = -1 // for safety
*pq = old[0 : n-1]
return item
}
当我开始尝试使用此代码以确保理解它时,我尝试:
item := *pq[0] // error
这为您提供了类型*[]T不支持索引。但如果您这样做了:
item := (*pq)[0] // all is well
这是类型断言,对吗?希望有人能解释一下这是怎么回事。
以下是快速显示这一点的一些代码:https://play.golang.org/p/uAzYASrm_Q
推荐答案
适合您的不是类型断言,而是操作顺序。
问题的根源在于索引先于指针的取消引用。一旦您用大括号括起指针取消引用,一切都会正常工作,因为索引将应用于现在取消引用的PriorityQueue
实例。
您不需要对数组指针执行此操作,因为它们会自动解除引用-下面解释索引数组和片之间的细微差别:The Go Programming Language Specification - Index expressions
对于数组类型
A
的a
:
- 常量索引必须在范围内
- 如果
x
在运行时超出范围,则会发生运行时死机- 的元素类型
a[x]
是索引x
的数组元素,a[x]
的类型是A
for
a
指向数组类型的指针:
- 的缩写
a[x]
是(*a)[x]
对于切片类型
S
的a
:
- 如果
x
在运行时超出范围,则会发生运行时死机- 的元素类型
a[x]
是索引x
的切片元素,a[x]
的类型是S
这篇关于指向切片和数组的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文