在go中的unsafe.SliceData函数的文档中,它说:SliceData返回一个指向参数slice的底层数组的指针。
SliceData
cap(slice)
&slice[:1][0]
返回&slice[:1][0]而不是&slice[0]背后的逻辑是什么?据我所知(我的tests确认),两者将返回相同的地址。go开发人员选择使用前者而不是后者有什么具体原因吗?
&slice[0]
3qpi33ja1#
一个切片可能有正的容量(cap(slice) > 0),但同时它可能有0的长度。像slice[0]一样索引它会导致运行时死机。如果一个切片有正容量,你可以像slice[:1]一样切片,这将导致一个长度为1的切片,你可以像result[0]一样索引结果,而不会导致运行时死机。举例来说:
cap(slice) > 0
0
slice[0]
slice[:1]
1
result[0]
slice := make([]int, 0, 5)fmt.Println(&slice[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])
型
1条答案
按热度按时间3qpi33ja1#
一个切片可能有正的容量(
cap(slice) > 0
),但同时它可能有0
的长度。像slice[0]
一样索引它会导致运行时死机。如果一个切片有正容量,你可以像
slice[:1]
一样切片,这将导致一个长度为1
的切片,你可以像result[0]
一样索引结果,而不会导致运行时死机。举例来说:
字符串
这导致:
型
但这是可行的:
型