2016-03-26 2 views
4

я смотрел (https://golang.org/pkg/container/heap/) пример очереди Приоритет кучного пакета golang в и наткнулся на это:Golang указатель на срез и массив

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

+0

Нет, 'pq' является переменной. '(* pq)' - это оператор разыменования переменной. Итак, '(* pq) [0]' эквивалентно 'a: = * pq; а [0] '. – joshlf

ответ

5

То, что работает для вас, не утверждение типа - это операция заказа.

Проблема связана с тем, что индексирование предшествует разыменованию вашего указателя. Когда вы кладете фигурные скобки вокруг разыменования указателя, все работает хорошо, потому что индексирование применяется к разыменованному экземпляру PriorityQueue.

Вам не нужно делать это для указателей массива, так как они автоматически разыменовываются - небольшая разница между индексацией массивами и ломтиками объясняются здесь: The Go Programming Language Specification - Index expressions

Для a типа массива A:

  • постоянный индекс должен быть в диапазоне
  • , если x находится вне диапазона во время выполнения, время выполнения паника происходит
  • a[x] является элемент массива с индексом x и тип a[x] является тип элемента A

Для a указателя на тип массива:

  • a[x] это сокращение для (*a)[x]

Для a среза типа S:

  • , если x находится вне диапазона во время выполнения, происходит во время выполнения паники
  • a[x] является срез элемента с индексом x и тип a[x] является тип элемента от S
+0

Отличный смысл. Спасибо! – khalieb

+0

как насчет указателя на тип среза[email protected] Димитр Димитров – kamal

Смежные вопросы