簡體   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