go 中的 slice[:1][0] 与 slice[0]

avi*_*iro 1 pointers go slice

在go中的unsafe.SliceData函数的文档中,它说:

SliceData返回指向参数切片的基础数组的指针。

  • 如果cap(slice)> 0,则SliceData返回&slice[:1][0]

&slice[:1][0]return而不是背后的逻辑是什么&slice[0]?据我所知(并且我的测试证实),两者都会返回相同的地址。Go 开发者选择使用前者而不是后者有什么具体原因吗?

icz*_*cza 6

切片可能具有正容量 ( ),但同时也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)