在go中的unsafe.SliceData函数的文档中,它说:
SliceData返回指向参数切片的基础数组的指针。
- 如果
cap(slice)> 0,则SliceData返回&slice[:1][0]。
&slice[:1][0]return而不是背后的逻辑是什么&slice[0]?据我所知(并且我的测试证实),两者都会返回相同的地址。Go 开发者选择使用前者而不是后者有什么具体原因吗?
切片可能具有正容量 ( ),但同时也cap(slice) > 0可能具有长度。0像这样对其建立索引slice[0]会导致运行时恐慌。
如果切片具有正容量,您可以像slice[:1]这样对它进行切片,这将导致切片的长度为1,并且您可以像这样对结果进行索引result[0],而不会导致运行时恐慌。
例如:
slice := make([]int, 0, 5)
fmt.Println(&slice[0])
Run Code Online (Sandbox Code Playgroud)
这导致:
panic: runtime error: index out of range [0] with length 0
Run Code Online (Sandbox Code Playgroud)
但这有效:
fmt.Println(&slice[:1][0])
Run Code Online (Sandbox Code Playgroud)