首頁  >  文章  >  後端開發  >  切片與Go中的切片

切片與Go中的切片

王林
王林轉載
2024-02-05 23:42:03362瀏覽

切片與Go中的切片

問題內容

在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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除