在围棋unsafe.SliceData函数的文档中,它说:
SliceData
返回指向参数的基础数组的指针 切成薄片.
- 如果
cap(slice)
为0,则SliceData
返回&slice[:1][0]
.
返回&slice[:1][0]
而不是&slice[0]
背后的逻辑是什么?据我所知(和我的tests确认),两者都会返回相同的地址.围棋开发人员 Select 使用前者而不是后者有什么特别的原因吗?
在围棋unsafe.SliceData函数的文档中,它说:
SliceData
返回指向参数的基础数组的指针 切成薄片.
- 如果
cap(slice)
为0,则SliceData
返回&slice[:1][0]
.
返回&slice[:1][0]
而不是&slice[0]
背后的逻辑是什么?据我所知(和我的tests确认),两者都会返回相同的地址.围棋开发人员 Select 使用前者而不是后者有什么特别的原因吗?
一个切片可以具有正容量(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])