繁体   English   中英

Golang指向切片和数组的指针

[英]Golang pointer to slice and array

我正在查看golang的堆包( https://golang.org/pkg/container/heap/)Priority Queue示例,并且遇到了这个:

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实例。

您不需要为数组指针执行此操作,因为它们会自动解除引用 - 索引数组和切片之间的细微差别在此解释: Go编程语言规范 - 索引表达式

对于a阵列型的A

  • 常量索引必须在范围内
  • 如果x在运行时超出范围,则会发生运行时混乱
  • a[x]是索引x处的数组元素,而a[x]的类型是A的元素类型

对于a指针数组类型:

  • a[x](*a)[x]简写

对于a切片类型的S

  • 如果x在运行时超出范围,则会发生运行时混乱
  • a[x]是索引x处的切片元素,而a[x]的类型是S的元素类型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM