![](/img/trans.png)
[英]How to create an array or a slice from an array unsafe.Pointer in 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.