在go中的unsafe.SliceData函數的文件中,它說:
SliceData returns a pointer to the underlying array of the argument slice. If cap(slice) > 0, SliceData returns &slice[:1][0].
回傳 &slice[:1][0]
而不是 &slice[0]
背後的邏輯是什麼?據我所知(並且我的測試證實),兩者都會返回相同的地址。 Go 開發者選擇使用前者而不是後者有什麼具體原因嗎?
切片可能具有正容量(cap(slice) > 0
),但同時可能有0
長度。像 slice[0]
一樣對其進行索引會導致運行時恐慌。
如果切片具有正容量,您可以像slice[:1]
那樣對其進行切片,這將產生長度為1
的切片,並且您可以像result[0]
那樣對結果進行索引,而不會導致運行時恐慌。
例如:
slice := make([]int, 0, 5) fmt.Println(&slice[0])
這會導致:
panic: runtime error: index out of range [0] with length 0
但這有效:
fmt.Println(&slice[:1][0])
以上是切片與Go中的切片的詳細內容。更多資訊請關注PHP中文網其他相關文章!